jQuery Deferred - изчакване на динамичните асинхронни заявки да завършат всички, дори ако някои са неуспешни

Получих динамична асинхронна заявка (за jsfiddle използвах ajax), която трябва да изчакам независимо от успеха или неуспеха, което означава, че трябва да знам само, че всички процеси са завършени, дори ако някои заявки са неуспешни.

//Динамичен: В моя случай това се произвежда от ajax заявка, така че броят на последващите асинхронни заявки е гъвкав

Така че първоначално използвах този код:

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

Но в случай, че едно от отложените е неуспешно, обратното извикване при неуспешно извикване ще бъде извикано незабавно. Опитах се да го променя на always(), но резултатът е:

Uncaught TypeError: Обект # няма метод 'винаги'

И така, как мога да внедря винаги() вид решение за това?

Fiddle

Моят оригинален източник: jQuery Deferred - изчакване за завършване на множество AJAX заявки


person Marl    schedule 13.02.2013    source източник
comment
Бих предложил да използвате персонализирано отложено, което отчита успеха и неуспеха, след което се разрешава в края, въпреки че .always трябва да работи и тук.   -  person Kevin B    schedule 13.02.2013
comment
Като този? jsfiddle.net/marlberm2014/ekGeA/4   -  person Marl    schedule 13.02.2013


Отговори (2)


Ако просто искате да изчакате списък с $.Deferred да приключи, независимо че са rejected или resolved, имате решението в моя отговор във вашия оригинален източник jQuery Deferred - изчакване за завършване на множество 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();
}));
person Mordhak    schedule 14.02.2013
comment
По дяволите, отговорът вече е в източника. 0_0 Не го видях. Благодаря за отговора. - person Marl; 14.02.2013
comment
Благодаря ви много за това, аз всъщност не съм кодер на Javascript и това ми спаси живота! Знаете ли как след това мога да разбера кои са работили и кои са се провалили (и защо)? - person LaughingJohn; 11.03.2013
comment
Липсва Ви затваряща скоба на последния ред, трябва да е })); - person Chloraphil; 07.08.2013

Добре, както предложи Kevin B. Използвах персонализирано отложено, което ще бъде разрешено независимо от резултата от асинхронната заявка.

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();
});

Fiddle

person Marl    schedule 13.02.2013
comment
Откъде идва това магическо число 7? може ли да се изчисли вместо това? - person Kevin B; 13.02.2013
comment
Той само симулира случая, когато една от заявките е неуспешна. - person Marl; 13.02.2013