J'ai une fonction javascript qui devrait renvoyer un géocodage pour une chaîne:
function codeAddress(address) { var result = (new google.maps.Geocoder()).geocode( { 'address': address}, function(results, status) { if (status == google.maps.GeocoderStatus.OK) { return String(results[0].geometry.location.Ya)+','+String(results[0].geometry.location.Za) } else { return status; } }); console.log(result); return result }
Cependant, il renvoie "indéfini". Je comprends le bug ici, c'est-à-dire, car javascript est asynchrone, il retourne à partir du codeAddress
function(results, status)
avant même que la function(results, status)
soit complètement exécutée. Mais je dois savoir quelle est la solution ici et la meilleure pratique.
Comme il est asynchrone, vous devez passer un rappel qui gère la fonction:
function codeAddress(address, callback) { (new google.maps.Geocoder()).geocode({ 'address' : address }, function(results, status) { if (status == google.maps.GeocoderStatus.OK) { callback(String(results[0].geometry.location.Ya) + ',' + String(results[0].geometry.location.Za)) } else { callback(status); } }); } codeAddress("test", function(result) { // do stuff with result });
Si vous utilisez jQuery, vous pouvez également utiliser différé:
function codeAddress(address, callback) { var dfd = new jQuery.Deferred(); (new google.maps.Geocoder()).geocode({ 'address' : address }, function(results, status) { if (status == google.maps.GeocoderStatus.OK) { // trigger success dfd.resolve(String(results[0].geometry.location.Ya) + ',' + String(results[0].geometry.location.Za)); } else { // trigger failure dfd.reject(status); } }); return dfd; } codeAddress("some address").then( // success function(result) { // do stuff with result }, // failure function(statusCode) { // handle failure } );