I am using a custom field in my Facebook registration plugin and need to validate a zipcode field that returns a boolean value, somehow because of this inner function:
geocoder.geocode({ address: address }, function (results, status) {
}
I am not able to return a value to my addExist variable and it always returns ‘Undefined’. Can anyone help? Thanks.
<fb:registration redirect_uri="http://localhost:40153/Account/RegisterDestination.aspx"
fields='[
{"name":"name"},
{"name":"gender"},
{"name":"email"},
{"name":"birthday"},
{"name":"password"},
{"name":"zip","description":"Postal Code","type":"text"}]'
onvalidate="validate"></fb:registration>
function validate(form) {
errors = {};
if (form.zip !== "") {
var addExist = calculateCoordinates(form.zip.toString());
// alert(addExist);
if (!addExist) {
errors.zip = "Cannot locate address";
}
}
return errors;
}
function calculateCoordinates(zip) {
var txtPostcode = zip;
// var address = txtAddress1.value + ', ';
// address += txtAddress2.value + ', ';
// address += txtTown.value + ', ';
var address = txtPostcode;
// address += txtCountry.value;
var geocoder;
geocoder = new google.maps.Geocoder();
geocoder.geocode({ address: address }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var location = results[0].geometry.location;
var litLatClientId = document.getElementById("<%=litLat %>");
var litLongClientId = document.getElementById("<%=litLong %>");
$("#" + litLatClientId).val(location.lat());
$("#" + litLongClientId).val(location.lng());
// Successfully reach here but the bool variable 'addExist' value gets an 'Undefined' value.
return true;
}
else
return false;
});
}
calculateCoordinatesis usinggeocode, which is an asynchronous function. It therefore follows that it must itself be used asynchronously in order to ‘return’ any data from the inner asynchronously function. This is done by using the callback pattern.Unfortunately, you are using it synchronously, and the registration plugin also expect
validateto be synchronously. There is therefor essentially no way of making this work.