J'ai un problème lorsque vous utilisez la jQuery .ach () et .ajax () fonctions ensemble. J'utilise .ach () pour boucler à travers 5 éléments et que vous effectuez l'appel de .ajax () pour chacun. Mon problème est que je veux seulement que la boucle se poursuive lorsqu'une réponse a été reçue de chaque demande AJAX. Actuellement, les 5 éléments sont enroulées, 5 demandes AJAX étant faites, puis 5 réponses étant retournées.
Hers est un exemple simple: p> acclamations. P> p>
5 Réponses :
Vous pouvez utiliser le async code>
option pour cela pour faire Chaque demande synchrone (= Halt Script Execution jusqu'à la fin de chaque demande): P>
async fort> Par défaut, toutes les demandes sont envoyées asynchrones (c'est-à-dire que ceci est défini sur true par défaut). Si vous avez besoin de demandes synchrones, définissez cette option sur FALSE. Demandes et dataType de domaine croisé: "JSONP" Les demandes ne prennent pas en charge l'opération synchrone. Notez que les demandes synchrones peuvent verrouiller temporairement le navigateur, désactivant toutes les actions lorsque la demande est active. P> blockQuote>
Mais, comme les Docs disent déjà, cela est très découragé, car il pourrait geler le navigateur si une demande est suspendue ou une fois. p>
Il serait préférable de changer l'architecture de votre code d'une manière qui peut fonctionner avec les fonctions de rappel classiques si possible. P>
Bravo pour l'aide, je suis allé avec votre suggestion et j'ai changé la structure de mon code, j'ai supprimé la boucle et utiliser la récursivité à la place. Fonctionne bien maintenant.
Pekka a la bonne réponse. Il vous suffit de modifier votre script comme ci-dessous.
$(".element").each(function() { var id= $(this).find(('txtId').val(); $.ajax({ type: "POST", async: false, url: "/Handlers/Handler.ashx", data: "ID=" + id, success: function(xml){ } }); });
J'ai essayé cela, je peux voir pourquoi il est très découragé. Apparemment définir cela sur FAUX fait geler mon navigateur jusqu'à ce que toutes les réponses aient été reçues et que la boucle ait fini.
Je ne suis pas sûr de ce que vous attendiez. Si vous voulez que le script met en pause et attendez la réponse, cela fera exactement cette pause et attendre. Peut-être devriez-vous expliquer ce qu'il est exactement que vous cherchez à accomplir car il peut y avoir une meilleure façon. Il existe probablement un meilleur moyen d'atteindre les résultats finaux que vous désirez avec un algorithme différent.
Je suis heureux de dire qu'il y a un moyen ... mais c'est un peu méchant.
Si vous êtes sûr que la requête doit donner quelque chose de retour, vous pouvez supprimer la partie "tryessation". P>
Pourquoi ne pas sortir de chaque boucle lorsque la première requête Ajax renvoie-t-elle le succès?
Vous pouvez utiliser la fonction JQuery Deffered and Promis Fonction pour vérifier l'appel ASYNC est le succès ou non. http://joseoncode.com/2011/09/ 26 / A-Navigation-JQuery-différé-and-promess / p>
Bien qu'il soit en retard, j'ai utilisé un travail autour de cette J'ai créé une fonction pour gérer la demande Ajax en passant l'élément
p> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="element">
<input class="txtId" value="textid1"/>
</div>
<div class="element">
<input class="txtId" value="textid2"/>
</div>
<div class="element">
<input class="txtId" value="textid3"/>
</div>