2011-05-25 7 views
1

Je crois que j'ai un problème de synchronisation avec les résultats du géocodeur. Voir un extrait de code ci-dessous. Je fais essentiellement un géocode et j'obtiens le résultat. Je passe ensuite le résultat à une méthode côté serveur via l'appel jQuery AJAX. Enfin, le résultat de la méthode renvoie un objet JSON. En fonction du résultat, je peux ou non effectuer un deuxième géocode. Là est le problème.Google Geocoder Asynchronous Issue

Vous pouvez voir que j'ai une variable hasResult par défaut à false, et est basculée à true lorsqu'un résultat valide a été déterminé. Dans tous les cas, cela fonctionne parfaitement, sauf lorsque le besoin d'un deuxième géocode se produit. Le géocode se passe avec succès et le code s'exécute, mais la vérification finale hasResult renvoie toujours false. Comment se peut-il?

var hasResult = false;    
geocoder.geocode({ "address": address }, function (results, status) { 
    if (status == google.maps.GeocoderStatus.OK) { 
     $.ajax({ 
      url: "URL", 
      type: "POST", 
      dataType: "json", 
      data: results 
      contentType: "application/json; charset=utf-8", 
      success: function (result) { 
         if (result.Valid) { 
          hasResult = false; 
          //Some other code, works perfect        
         } else { 
          geocoder.geocode({ "address": result.ValidRequest }, function (resultsNew, statusNew) { 
           if (statusNew == google.maps.GeocoderStatus.OK) { 
            hasResult = false; 
            //Some other code, works perfect 
           } 
          }); 
         } 
        }); 
       }); 
      } 
     }); 
    } 
}); 

if (hasResult == true) { 
    alert('Success'); 
} else { 
    alert('Fail'); 
} 

Merci

Répondre

2

Ceci est parce que vous vérifiez la valeur de hasResultavant vous obtenez les résultats du serveur. Cela arrive, car la requête est asynchrone. Vous devriez utiliser les callbacks à la place.

Edit:

Essayez ceci (c'est seulement un mockup et n'a pas été testé, changer pour améliorer la lisibilité, passez successOrFailure comme paramètre/rappel, etc.):

var hasResult = false;    

var successOrFailure = function(hasResult){ 
    if (hasResult == true) { 
     alert('Success'); 
    } else { 
     alert('Fail'); 
    } 
}; 

geocoder.geocode({ "address": address }, function (results, status) { 
    if (status == google.maps.GeocoderStatus.OK) { 
     $.ajax({ 
      url: "URL", 
      type: "POST", 
      dataType: "json", 
      data: results 
      contentType: "application/json; charset=utf-8", 
      success: function (result) { 
         if (result.Valid) { 
          hasResult = false; 
          successOrFailure(hasResult); 
          //Some other code, works perfect        
         } else { 
          geocoder.geocode({ "address": result.ValidRequest }, function (resultsNew, statusNew) { 
           if (statusNew == google.maps.GeocoderStatus.OK) { 
            hasResult = false; 
            successOrFailure(hasResult); 
            //Some other code, works perfect 
           } 
          }); 
         } 
        }); 
       }); 
      } 
     }); 
    } 
}); 
+0

Alors, que Vous dites que le géocodeur est appelé, mais le script continue jusqu'à la déclaration conditionnelle et le reste se termine. Fait sens, pouvez-vous fournir une maquette de ce que vous proposez? –

+0

@Dusting J'ai ajouté un exemple brut pour vous montrer comment cela peut être fait. La fonction 'Callback' (en fait, la fonction 'successOrFailure') est exécutée après que vous ayez su si vous avez échoué ou réussi. Adaptez-le à vos besoins. Est-ce que ça marche pour toi? – Tadeck

+0

PARFAIT !!! Parfois, la solution est facile. –