jQuery ajax延迟回调命令

Jus*_*son 6 ajax jquery

在延迟对象的回调之前,我无法在每个ajax请求上执行done/fail/always回调.

我遇到的问题是我的一些ajax请求可能会失败,但我需要执行相同的代码,无论是失败还是没有失败.

很难准确解释,所以我做了这个小提琴,以帮助显示我遇到的问题. http://jsfiddle.net/zZsxV/

var a1 = $.Deferred();
var a2 = $.Deferred();
var a3 = $.Deferred();

a1.done(function() {
    $('body').append('a1 done<br />');     
}).fail(function() {
    $('body').append('a1 fail<br />');     
}).always(function() {
    $('body').append('a1 always<br />');     
});

a2.done(function() {
    $('body').append('a2 done<br />');     
}).fail(function() {
    $('body').append('a2 fail<br />');     
}).always(function() {
    $('body').append('a2 always<br />');     
});

a3.done(function() {
    $('body').append('a3 done<br />');     
}).fail(function() {
    $('body').append('a3 fail<br />');     
}).always(function() {
    $('body').append('a3 always<br />');     
});

var def = $.when(a1, a2, a3);
def.always(function() {
    $('body').append('defer always <-- should be after all<br />'); 
});

setTimeout(function() {
    a1.resolve();
}, 5000);
setTimeout(function() {
    a2.reject();
}, 1000);
setTimeout(function() {
    a3.resolve();
}, 3000);
Run Code Online (Sandbox Code Playgroud)

我在这个主题上阅读了很多答案,但我不相信我的需要完全符合.

更多信息需要帮助请告诉我,我会在我回来后添加它.提前致谢.


编辑

我明白发生了什么.我只知道如何避免这个问题.我尝试使用.then同样的结果.一旦一个请求被拒绝,它就会在等待其他回调之前触发失败回调.

fre*_*ish 2

根据jQuery 文档,当 所有参数都被解析或其中一个参数被拒绝$.when时,会触发回调。那么使用类似的东西而不是:$.when

var custom_when = function() {
    var args = $.makeArray(arguments);
    var callback = args.pop();
    var all = [];
    $.each(args, function(index, def) {
        def.always(function() {
            var idx = all.indexOf(def);
            if (idx !== -1) {
                all.splice(idx, 1);
            }
            if (!all.length) {
                callback();
            }
        });
        all.push(def);
    });
};
Run Code Online (Sandbox Code Playgroud)

你可以这样使用它:

custom_when(a1, a2, a3, function() {
    // do some stuff.
});
Run Code Online (Sandbox Code Playgroud)

jsFiddle 演示