2009-08-04 4 views
0

Ich bin ein kleines Feature implementieren und Art von stecken.Warten auf Javascript async Callback @ http Post

Ich habe einen Knopf, eine Aktion auszuführen, wie

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

Wenn der Benutzer auf die Schaltfläche klickt die Funktion DoSomething aufgerufen wird.

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

Innerhalb der Funktion eine Callback-Funktion definiert ist, die einen Asynchron-Betrieb durchführt, die den Namen einer Stadt in ein Formularfeld schreibt. Das Problem besteht darin, dass der asynchrone Rückruf versucht, in das Feld zu schreiben, nachdem die Seite gepostet wurde. Gibt es irgendwelche Möglichkeiten, den Post-Prozess auf das Callback-Ergebnis warten zu lassen? Der Rückruf ist in der Google Maps-API definiert und kann nicht vermieden werden.

Vielen Dank im Voraus

Antwort

1

Zuerst möchten Sie die Onclick-Handler-Code ändern, um eine return-Anweisung enthalten etwa so:

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

dann die DoSomething Funktion ändern false zurück, so dass sumit wird, wenn storniert werden Es arbeitet an dem asynchronen Rückruf. Und ändern Sie den asynchronen Rückruf, um das Formular zu posten, wenn Sie fertig sind.

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 
} 

Ein weiterer Ansatz wäre eine onSubmit Handler auf dem Formular zu schließen und eine globale Flag, um zu bestimmen zu verwenden, wenn die Einreichung des Formulars erlaubt ist (dh wenn es kein Asynchron-Rückruf noch im Flug). Wenn der Asynchron-Rückruf kehrt würden Sie das Flag löschen und das Formular von Javascript erneut einreichen, wie ich oben gezeigt, ruft die submit() Methode auf dem Formelement.

+0

Hammerzeit;) Aber es mag den Trick ziehen. – Dante

+0

Vielen Dank, funktioniert wie ein Charme;) – Dante

+0

Nur eine kleine Anmerkung: Ich habe den Typ auf Schaltfläche geändert und nicht von der Funktion zurückkehren. Es ist eine Verschmelzung zwischen beiden Antworten. – Dante

0

Verwenden Sie eine normale Schaltfläche (type = "Schaltfläche") anstelle einer Schaltfläche Senden, damit das Formular nicht gebucht wird. Veröffentlichen Sie das Formular stattdessen aus der Callback-Funktion.