Accès au tableau depuis l'extérieur de la boucle de géocode

J'ai réussi à géocoder jusqu'à 10 adresses et à ajouter un marqueur à la carte, mais j'ai besoin d'accéder aux résultats de géocode en dehors de la fonction Geocode (codeAddress). Je pensais pouvoir pousser les résultats vers un tableau variable global (userLat, userLng). En utilisant les alertes, je peux voir que la boucle ajoute effectivement les résultats au tableau dans la fonction, mais le tableau est sans valeur en dehors de la fonction.

Sur une note latérale, l'alerte pour le géocodage échoué devrait renvoyer l'adresse 'i' en fonction de l'adresse qui avait le problème, mais affiche uniquement la dernière valeur d'adresse de la boucle.

Peut-être que les problèmes sont liés? Je pense que cela peut avoir quelque chose à voir avec mon manque de compréhension de la fonction imbriquée.

J'espère que ceci est clair. Merci d'avance pour votre aide!

function codeAddress() { var useradd = []; var geocoder = new google.maps.Geocoder(); var howmany = parseFloat(document.getElementById("howmany").value); for (var i=0; i<howmany; i++) { useradd[i] = document.getElementById('address['+i+']').value; geocoder.geocode( {address: useradd[i]}, function(results, status) { if (status == google.maps.GeocoderStatus.OK) { userLat.push(parseFloat(results[0].geometry.location.lat())); userLng.push(parseFloat(results[0].geometry.location.lng())); var marker = new google.maps.Marker({ map: map, position: results[0].geometry.location }); } else { alert('Address ' + i + ' was not successfully located for the following reason: ' + status); } }); }; } 

Modifier:

Je ne sais pas si j'ai bien compris, mais j'ai extrait la fonction de rappel et créé une nouvelle fonction qui est appelée par le géocodeur. Le problème est toujours le même et les variables userLat et userLng ne sont pas transmises en dehors de la boucle. Aucune suggestion?

Function codeAddress () {

 function callBack() { return function(results, status){ if (status == google.maps.GeocoderStatus.OK) { userLat.push(parseFloat(results[0].geometry.location.lat())); userLng.push(parseFloat(results[0].geometry.location.lng())); var marker = new google.maps.Marker({ map: map, position: results[0].geometry.location }); } else { alert('Address ' + i + ' was not successfully located for the following reason: ' + status); } } } var userLat = []; var userLng = []; var useradd = []; var geocoder = new google.maps.Geocoder(); var howmany = parseFloat(document.getElementById("howmany").value); for (var i=0; i<howmany; i++) { useradd[i] = document.getElementById('address['+i+']').value; geocoder.geocode({address: useradd[i]}, callBack()); }; } 

Lorsque votre fonction codeAddress retourne, geocoder.geocode effectue toujours son travail, ce qui est asynchrone . Lorsque geocoder.geocode est terminé, il invoque son rappel, que vous passez en tant que fonction anonyme.

La solution que je suggère est de rendre le rappel fonctionnant comme un paramètre de codeAddress , et faire tout ce que vous avez besoin de ce rappel (ou d'une autre fonction appelée dans le rappel), au lieu d'utiliser l'approche des variables globales.

Il s'agit de la portée en Javascript. Si vous souhaitez accéder à des variables en dehors de la fonction, vous devez déclarer et créer des variables en dehors de la portée de la fonction, puis les mettre à jour.

Les variables déclarées en dehors de la portée de la fonction seront disponibles partout ailleurs dans le script.

  var def = "bombshell"; function changer(){ def = "changed value"; } changer(); alert(def); 

Voyez-le ici – http://jsfiddle.net/daveheward/kWn8b/