Esperando javascript assíncrono callback @ http pós
-
22-07-2019 - |
Pergunta
Estou implementando um pequeno recurso e tipo de preso.
Eu tenho um botão para executar alguma ação, como
<input type="submit" value="My Button" onclick="javascript:DoSomething();" />
Quando o usuário clica no botão da função DoSomething é chamado.
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;
}
});
}
Dentro da função uma função de retorno é definido, que executa uma operação assíncrona que escreve o nome da cidade em um campo de formulário. O problema é que o retorno de chamada assíncrono vai tentar escrever no campo após a página é remetida. Existe alguma era eu posso tornar a espera pós processo para o resultado de retorno de chamada? O retorno é definido na API do Google Maps e não posso evitá-lo.
Agradecemos antecipadamente
Solução
Primeiro você deseja modificar o código manipulador onclick para incluir uma instrução de retorno assim:
<input type="submit" value="My Button" onclick="javascript:return DoSomething();" />
Em seguida, modificar a função DoSomething para retornar false para que sumit será cancelado se ele está funcionando no retorno de chamada assíncrono .. E modificar o retorno de chamada assíncrono para enviar o formulário quando feito.
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
}
No entanto, outra abordagem seria incluir um onSubmit manipulador em seu formulário e usar um sinalizador global para determinar se a submeter do formulário é permitido (ou seja, se houver não assíncrono callback ainda em vôo). Quando os assíncrono callback retorna você iria limpar o sinalizador e reenvie a forma de javascript como eu demonstrei acima, chamando o método submit () na forma elemento .
Outras dicas
Use um botão normal (type = "button") em vez de um botão de envio para que o formulário não é lançado. Postar o formulário a partir da função de retorno em seu lugar.