12
votes

Jquery ajax appelle dans une boucle de chaque boucle

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: xxx

acclamations.


0 commentaires

5 Réponses :


11
votes

Vous pouvez utiliser le async option pour cela pour faire Chaque demande synchrone (= Halt Script Execution jusqu'à la fin de chaque demande):

async 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.

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.

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.


1 commentaires

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.



3
votes

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){

       }
     });

});


2 commentaires

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.



0
votes

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". xxx


1 commentaires

Pourquoi ne pas sortir de chaque boucle lorsque la première requête Ajax renvoie-t-elle le succès?



0
votes

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 /


0 commentaires

0
votes

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>


0 commentaires