4 votes

jQuery Deferred - attendre que les requêtes asynchrones dynamiques se terminent toutes même si certaines ont échoué

J'ai une demande asynchrone dynamique (pour le jsfiddle j'ai utilisé ajax) que je dois attendre indépendamment du succès ou de l'échec, ce qui signifie que j'ai seulement besoin de savoir que tous les processus sont terminés même si certaines demandes ont échoué.

//Dynamique : Dans mon cas, ceci est produit par une requête ajax, donc le nombre de requêtes asynchrones est flexible.

J'ai donc utilisé ce code à l'origine :

    $.when.apply($,deferreds).done(function() {
        $("div").append("<p>All done!</p>");
    }).fail(function(){
        $("div").append("<p>Something failed!</p>");
    });

Mais dans le scénario où l'un des différés échoue, le callback d'échec sera appelé immédiatement. J'ai essayé de le changer en toujours() mais le résultat est :

Erreur de Type Non Rattrapée : Object # n'a pas de méthode 'always'.

Alors comment puis-je mettre en œuvre une solution de type always() pour cela ?

Violon

Ma source originale : jQuery Deferred - attente de la fin de plusieurs requêtes AJAX

9voto

Mordhak Points 1543

Si vous voulez simplement attendre une liste de $.Deferred à la fin, peu importe qu'ils soient rejected o resolved Vous avez la solution dans ma réponse dans votre source originale. jQuery Deferred - attente de la fin de plusieurs requêtes AJAX :

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

0voto

Marl Points 1410

Ok comme quoi Kevin B suggéré. J'ai utilisé un différé personnalisé qui sera résolu quel que soit le résultat de la requête asynchrone.

var deferreds = $.map(i, function (count, index){
    var waitingProcess = new $.Deferred(); //Here is the custom deferred
    if(count == 7) {
        $.Deferred().fail(function(){
            $("div").append("<p>Task #" + count + " failed.");
            waitingProcess.resolve(); //resolve it no matter the outcome
        }).reject();
    }else{
        $.post('/echo/html/', {
            html: "<p>Task #" + count + " complete.",
            delay: count
        }).success(function(data) {
            $("div").append(data);
            waitingProcess.resolve(); //resolve it no matter the outcome
        });
    }
    return waitingProcess.promise();
});

Violon

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