Bonjour à tous,

Pour un de mes projets je dois faire des requêtes AJAX dans une boucle for

for(var i = 0; i < contacts.length; i++) {
    $.ajax({
        url: href,
        type: "post",
        data: datas,
            success: function(response) {
                if(!response.result) {
                    alert('Tu as tout planté !');
                }
            }
    });
}

// suite de mon script qui doit attendre la fin réelle des requêtes AJAX

Le problème est que tout les requêtes AJAX partent en même temps et je n'ai aucun moyen de savoir (ou du moins je ne connais pas encore) quand toutes mes requètes AJAX sont terminés.

Ou alors, il faudrait que toutes mes requêtes AJAX se lancent les unes après les autres. Quand la première est terminée, elle lance la deuxième. Car j'ai un système d'incrémentation dans une popup ...

J'ai regardé sur la doc il exite la fonction $.when().then(); mais j'ai le même problème.

Des idées ?

Merci d'avance et bon weekend

9 réponses


antho07
Réponse acceptée

Bonjour ,

Une solution :


var requestCompleted = 0;
for(var i = 0; i < contacts.length; i++) {
    $.ajax({
        url: href,
        type: "post",
        data: datas,
            success: function(response) {
                requestCompleted ++;

                if(!response.result) {
                    alert('Tu as tout planté !');
    break ; //si le but est de stopper si ya une erreur
                }
requestCompleted++;
if(requestCompleted == contacts.length){
suite();
}
            }
    });
}

var suite = function(){
//la suite du script
};
Blondin69
Réponse acceptée

Bonjour, il existe une fontion jquery qui se déclenche quand toutes les requetes ajax sont terminé.

$( document ).ajaxComplete(function() {
  $( ".log" ).text( "Triggered ajaxComplete handler." );
});

Voila si sa peu aider!

Salut,

L'idee est bonne mais dans ce cas je ne detecte qu'une fois que ma derniere requete est terminee et non une fois que toutes mes requetes sont terminees. deplus je vais avoir le meme resultat car toutes mes requetes vont se lancer rapidement et je vais avoir la suite de ma fonction directement.

Faux parce que c'est asynchrone;

L'ordre de déclenchement des callback n'est pas prévisible;
Ici on compte le nombre de retour obtenu, peu importe l'ordre... donc effectivement le script se déclenche lorsque la dernière réponses est reçue au sens toutes les réponses ont été reçues (pas au sens où la réponse de la dernière requête est arrivée)

Autant pour moi, j'avais mal vu sur mobile, effectivement ton systeme peut marcher. Je testerai ca Lundi

Tu peux avoir lancé req1, req2 et req3 dans l'ordre mais avoir reçu rep2,rep1 puis rep3 (si on note repX la réponse de reqX)
Au final si on se dit j'ai 3 réponses à obtenir et qu'on met un compteur :

rep reçue => compteur +1
rep' reçue => compteur +1
rep '' reçue => compteur +1

3 réponses obtenues, on arrête.. on se moque de savoir à quoi correspondent les réponses, on sait que c'est terminé.

Oui tu as raison mais j'avais mal lu le code que tu avais posté

Je viens de test et merci.
Par contre, j'ai ce message avec le break : Uncaught SyntaxError: Illegal break statement
Une autre astuce pour couper le script ?

Je me garde ça sous le coude, la méthode de antho07 fonctionne bien.

Merci