In attesa di callback asincrono javascript @ post http
-
22-07-2019 - |
Domanda
Sto implementando una piccola funzione e un po 'bloccato.
Ho un pulsante per eseguire alcune azioni, come
<input type="submit" value="My Button" onclick="javascript:DoSomething();" />
Quando l'utente fa clic sul pulsante viene chiamata la funzione 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;
}
});
}
All'interno della funzione è definita una funzione di richiamata, che esegue un'operazione asincrona che scrive il nome di una città in un campo modulo. Il problema è che il callback asincrono proverà a scrivere nel campo dopo che la pagina è stata pubblicata. È possibile che il processo di post attenda il risultato della richiamata? Il callback è definito nell'API di Google Maps e non posso evitarlo.
Grazie in anticipo
Soluzione
Innanzitutto si desidera modificare il codice del gestore onclick per includere un'istruzione return in questo modo:
<input type="submit" value="My Button" onclick="javascript:return DoSomething();" />
Quindi modifica la funzione DoSomething per restituire false in modo che sumit venga annullato se funziona sul callback asincrono .. E modifica il callback asincrono per pubblicare il modulo al termine.
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
}
Ancora un altro approccio sarebbe quello di includere un gestore onSubmit nel modulo e utilizzare un flag globale per determinare se è consentito l'invio del modulo (ovvero se è presente nessuna richiamata asincrona è ancora in volo). Quando il callback asincrono ritorna, deselezionate il flag e reinviate il modulo da javascript come ho dimostrato sopra, chiamando il metodo submit () sul modulo elemento .
Altri suggerimenti
Utilizza un pulsante normale (tipo = " pulsante ") invece di un pulsante di invio in modo che il modulo non venga pubblicato. Pubblica invece il modulo dalla funzione di callback.