Si vous utilisez $ .post dans une fonction javascript, vous ne pouvez pas affecter de valeur à une variable
Question
J'essaie d'utiliser $ .post dans une fonction, obtenir les résultats, puis renvoie la fonction true ou false en fonction des résultats du rappel $ .post. Cependant, le rappel semble se produire, APRÈS l'événement de retour de la fonction parent.
Voici le code actuel, la variable ret est toujours indéfinie, mais si je l’alerte () dans le rappel $ .post, elle renvoie le résultat correct;
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;
}
La solution
Comme vous l'avez découvert, la publication est faite de manière asynchrone. Si vous voulez qu'il soit synchrone, vous devrez utiliser le ajax
et définissez le paramètre async
sur false. Il serait toutefois préférable de reconnaître que la publication est asynchrone et de construire votre code de sorte que l'action effectuée par le rappel soit indépendante de la méthode qui appelle la publication. Évidemment, vous voulez vraiment faire autre chose que l'alerte, mais sans savoir ce qu'il est difficile de vous conseiller sur la façon de reformuler cela.
MODIFIER : je comprends que votre code vérifie si quelque chose existe, mais il vérifie cela dans un but précis. Si nous savions quel était le but, il serait alors possible de recommander comment y parvenir dans le rappel afin que la méthode puisse être refactorisée.
Autres conseils
function elementExists(key, type, path, appid, pid){
$.post('?do=elExists', {key: key, type: type, path: path, appid: appid, pid: pid},function(data){
alert(data);
});
}
la fonction (données) est un rappel (asynchrone). Vous ne pouvez pas renvoyer de telles valeurs.
si le rappel n’est pas appelé tant que la page n’a pas été appelée, mais votre "return ret". est en cours d'exécution immédiatement après avoir appelé $ .post
Si vous souhaitez le définir de manière syncrone, définissez async: false
Voir la documentation http://docs.jquery.com/Ajax/jQuery.post#urldatacallbacktype
Le problème est que votre code s'exécute de manière asynchrone. C'est alert (ret) est effectivement appelé avant ret = data, ce qui se produit lorsque la demande Ajax est terminée.
Vous pouvez rendre vos appels ajax synchrones (non recommandé) à l'aide de async option, ou reconcevoir votre code.