2009-08-04 7 views
0

Je suis en train de mettre en œuvre une petite fonctionnalité et le type de blocage.En attente de rappel asynchrone javascript @ http post

J'ai un bouton pour exécuter une action, comme

<input type="submit" value="My Button" onclick="javascript:DoSomething();" /> 

Lorsque l'utilisateur clique sur le bouton est appelé la fonction DoSomething.

function DoSomething() 
    { 
     var geocoder = new GClientGeocoder(); 
     geocoder.getLocations(map.getCenter(), function SetField(response) 
      { 
      if (!response || response.Status.code != 200) 
      { 
       alert("Status Code:" + response.Status.code); 
      } 
      else 
      { 
       var place = response.Placemark[0]; 
       $('#someHiddenField')[0].value = place.AddressDetails.Country.CountryNameCode; 
      } 
      }); 
} 

l'intérieur de la fonction d'une fonction de rappel est définie, qui effectue une opération asynchrone qui écrit un nom de ville, dans un champ de formulaire. Le problème est que le rappel asynchrone essayera d'écrire dans le champ après que la page soit postée. Est-ce que je pouvais faire en sorte que le post-traitement attende le résultat du rappel? Le rappel est défini dans l'API Google Maps et je ne peux pas l'éviter.

Merci à l'avance

Répondre

1

D'abord vous voulez modifier le code du gestionnaire onclick d'inclure une déclaration de retour comme ceci:

<input type="submit" value="My Button" onclick="javascript:return DoSomething();" /> 

modifier ensuite la fonction DoSomething pour revenir faux afin que Sumit sera annulée si cela fonctionne sur le rappel asynchrone .. Et modifiez le rappel asynchrone pour signaler le formulaire une fois terminé.

function DoSomething(doPost) 
{ 
     var geocoder = new GClientGeocoder(); 
     geocoder.getLocations(map.getCenter(), function SetField(response) 
      { 
      if (!response || response.Status.code != 200) 
      { 
       alert("Status Code:" + response.Status.code); 
      } 
      else 
      { 
       var place = response.Placemark[0]; 
       $('#someHiddenField')[0].value = place.AddressDetails.Country.CountryNameCode; 

       // resubmit the form here 
       $('#yourFormID').submit(); 
      } 
      }); 

     return false; // cancel the submitting of the form 
} 

Une autre approche serait d'inclure un gestionnaire onSubmit sur votre formulaire et utiliser un indicateur global pour déterminer si la soumission du formulaire est autorisée (s'il n'y a pas de rappel async encore en vol). Lorsque le rappel async retourne vous effacer l'indicateur et soumettre à nouveau la forme de javascript comme je l'ai démontré ci-dessus, appelant la méthode submit() sur l'élément de forme .

+0

Temps de marteau;) Mais cela peut faire l'affaire. – Dante

+0

Merci, fonctionne comme un charme;) – Dante

+0

Juste une petite note: j'ai changé le type en bouton et ne reviens pas de la fonction. C'est une fusion entre les deux réponses. – Dante

0

Utilisez un bouton normal (type = "button") au lieu d'un bouton submit pour que le formulaire ne soit pas publié. Publiez le formulaire à partir de la fonction de rappel à la place.