Comment renvoyer la valeur à la fonction parent à partir de la fonction anonyme anonyme

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 } );