Usando $ .post dentro de uma função javascript, pode não o valor atribuir a uma variável?
Pergunta
Eu estou tentando usar $ .post dentro de uma função, obter os resultados, em seguida, retornar a função de verdadeiro ou falso com base nos resultados do callback $ .post. No entanto, o retorno de chamada parece ocorrer, após o evento de retorno da função pai.
Aqui está o código atual da variável ret é sempre indefinido, mas se eu alert ()-lo dentro do callback $ .post, ele retorna o resultado correto;
function elementExists(key, type, path, appid, pid){
var ret;
$.post('?do=elExists', {key: key, type: type, path: path, appid: appid, pid: pid},function(data){
ret = data;
});
alert(ret);
return ret;
}
Solução
Como você descobriu o post é feito de forma assíncrona. Se você quer que ele seja síncrona, você precisa usar a ajax
método e definir o parâmetro async
como falsa. Seria melhor, no entanto, reconhecer que o post é assíncrona e construir o seu código para que a ação executada pela chamada de retorno é independente do método que chama o post. Obviamente, você realmente quer fazer algo diferente do alerta, mas sem saber o que é difícil para aconselhá-lo como refatorar isso.
Editar : Eu entendo que o seu código está verificando para ver se algo existe, mas é a verificação de que para um propósito. Se soubéssemos o que o propósito era, então pode ser possível recomendar como conseguir isso no retorno de chamada para que o método poderia ser reformulado.
Outras dicas
function elementExists(key, type, path, appid, pid){
$.post('?do=elExists', {key: key, type: type, path: path, appid: appid, pid: pid},function(data){
alert(data);
});
}
a função (de dados) é uma volta chamada (Asynchronous) você não pode retornar valores assim.
que callback não é chamado até que a página é feito de ser chamado, mas o seu "ret retorno" está em execução imediatamente depois de chamar $ .post
Se você quiser configurá-lo conjunto assíncrono syncronous: false
Veja os docs http://docs.jquery.com/Ajax/jQuery.post#urldatacallbacktype
O problema é que seu código é executado de forma assíncrona. Isso é alert (ret) é realmente chamado antes ret = dados, o que acontece quando a solicitação Ajax é concluída.
Você pode fazer a sua ajax chama síncrona (não recomendado), utilizando a assíncrona opção, ou redesenhar o seu código.