57 votes

jQuery Deferred - en attente de plusieurs demandes AJAX pour terminer

J'ai une chaîne profonde de trois couches d'appels ajax différés, et idéalement, ils vont tenir la promesse jusqu'au bout lorsque la couche la plus profonde se termine (me fait penser à Inception ... "nous devons aller plus loin!").

Le problème est que j'envoie plusieurs demandes ajax (peut-être des centaines) en même temps et que je dois attendre jusqu'à ce qu'elles soient toutes terminées. Je ne peux pas compter sur le dernier en cours.

     function updateAllNotes(){
        return $.Deferred(function(dfd_uan){
            getcount=0;
            getreturn=0;
            for (i=0;i<=index.data.length-1;i++){
                getcount++;
                $.when(getNote(index.data[i].key)).done(function(){
                    // getNote is another deferred
                    getreturn++
                });
            };
            // need help here
            // when getreturn == getcount, dfd_uan.resolve()
        }).promise();
    };
 

108voto

brittohalloran Points 1355

Vous pouvez utiliser .when() et .apply() avec plusieurs reports. Extrêmement utile:

 function updateAllNotes () {
        var getarray = [], i, len;
        for (i = 0, len = data.length; i < len; i += 1) {
            getarray.push(getNote(data[i].key));
        };
        $.when.apply($, getarray).done(function () {
          // do things that need to wait until ALL gets are done
        });
};
 

27voto

Mordhak Points 1543

Si vous vous référez à jQuery.When doc, si l'un de vos appels ajax échoue, fail rappel maître sera appelé même si tous les appels ajax suivants ne sont pas encore terminés. Dans ce cas, vous n'êtes pas sûr que tous vos appels sont terminés.

Si vous voulez attendre tous vos appels, quel que soit le résultat, vous devez utiliser un autre différé comme celui-ci:

 $.when.apply($, $.map(data, function(i) {
    var dfd = $.Deferred();
    // you can add .done and .fail if you want to keep track of each results individualy
    getNote(i.key).always(function() { dfd.resolve(); });
    return dfd.promise();
});
 

7voto

Travis Points 709

Merci pour la réponse brittohalloran. J'utilise également Underscore. J'ai donc pu appliquer votre solution très proprement avec map, un peu comme ceci:

 $.when.apply($, _.map(data, function(i) {
    return getNote(i.key);
})).done(function() {
    alert('Be Happy');
});
 

Méchant utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X