Attendre AJAX pour terminer, avant de retourner à partir de la fonction?
J'ai le texte suivant
function doAjax()
{
var result = false;
$.ajax(url, data)
.done(function(){
//Do a bunch
//of computation
//blah blah blah
result = true;
}).fail(function(){
result = false;
});
return result;
}
function doSomething()
{
if ( doAjax() == true )
console.log('success');
else
console.log('failed');
}
function doSomethingElse()
{
if ( doAjax() == true )
console.log('success');
else
console.log('failed');
}
J'ai une fonction qui s'exécute quelques ajax, puis retourne true ou false selon que l'ajax a réussi ou pas. Cette fonction ajax-je appeler à partir de plusieurs endroits dans mon code.
Parce que la fonction se termine avant que l'ajax est terminée, il retourne toujours false. Comment puis-je éviter cela?
J'ai lu quelque chose de ce qui suggère que je fais une return $.ajax()
dans ma fonction, puis déplacez le .done()
et .fail()
fonctions de mon doSomething()
et doSomethingElse()
fonctions. Cependant, dans mon .done()
méthode, je fais un TAS de calcul. Beaucoup de code. Donc, le problème est que si je déplace le .done()
fonction de mes autres fonctions, je suis la duplication d'un tas de code.
Comment puis-je éviter cela? Juste envelopper le calcul dans la fonction et de l'appeler chaque fois que nécessaire?
result
toujours return false
, et c'est normal, parce que la requête ajax est asynchrone. Si vous avez vraiment a utiliser .done()
ou fonction de rappel. Et oui: pour éviter la duplication de code (si vous en quelque sorte eu ce problème) ensemble de code nécessaire de séparer la fonction.
OriginalL'auteur Jake Wilson | 2014-08-27
Vous devez vous connecter pour publier un commentaire.
Restructurer votre code pour utiliser les rappels au lieu de revient, c'est comme ça...
On dirait que vous avez un nouvelle question...
OriginalL'auteur Soren
Techniquement, vous pouvez vous rendre ajax
synchronous
comme ceci:Mais ce n'est pas recommandé(uniquement pour vraiment les choses spécifiques).
Sinon, il suffit d'utiliser
callbacks
comme vous pouvez le voir dans cet exemple:Lire plus ici.
OriginalL'auteur Amir Popovich
Ne JAMAIS faire
return
avec Ajax, ça ne fonctionnera jamais. Utiliser Ajaxsuccess
fonction:.done()
remplace le obsolète.success()
fonction.n'est pas déconseillée fonction...
De toute façon, votre fonction
return
(pas en ajax) sera exécutée avant l'ajax est fait etreturn
en ajax sera de retour à nulle part, utiliser les fonctions de rappelOriginalL'auteur Justinas
Il ne fonctionne pas, alors que votre Ajax est en mode asynchrone (
async: false
). Essayez de structurize votre code de cette façon:Donc votre calcul principale bloc
doABuncnchOfComputation()
restera intact et accessible pour chaque opération asynchrone.Paramètre mode Ajax synchrone tiendra navigateur à partir d'exécution, tandis que le réseau de transmission est dans l'état actif. En raison d'une possible instabilité du réseau, il peut conduire à une "mauvaise" expérience utilisateur du navigateur peut se bloquer, la page sera inactive et ne répond plus, alors que l'Ajax va envoyer/recevoir ou être en attente de données. Il est très peu fiable et décourageant.
OriginalL'auteur BlitZ