jQuery ajax延迟回调命令

jQuery ajax延迟回调命令,jquery,ajax,Jquery,Ajax,我无法在延迟对象的回调之前执行每个ajax请求的done/fail/always回调 我遇到的问题是,我的一些ajax请求可能会失败,但无论一个失败还是没有失败,我都需要执行相同的代码 很难准确解释,所以我做了这把小提琴来帮助说明我的问题。 var a1=$.Deferred(); var a2=$.Deferred(); var a3=$.Deferred(); a1.完成(函数(){ $('body').append('a1 done'); }).fail(函数(){ $('body').

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

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

很难准确解释,所以我做了这把小提琴来帮助说明我的问题。

var a1=$.Deferred();
var a2=$.Deferred();
var a3=$.Deferred();
a1.完成(函数(){
$('body').append('a1 done
'); }).fail(函数(){ $('body').append('a1 fail
'); }).always(函数(){ $('body').append('a1始终
'); }); a2.完成(函数(){ $('body').append('a2done
'); }).fail(函数(){ $('body').append('a2fail
'); }).always(函数(){ $('body').append('a2始终
'); }); a3.完成(功能(){ $('body').append('a3 done
'); }).fail(函数(){ $('body').append('a3 fail
'); }).always(函数(){ $('body').append('a3始终
'); }); 变量def=$时(a1、a2、a3); def.always(函数(){
$('body').append('defer always嘿,我遇到了与此类似的问题,我没有代码,但我会尝试找到它

无论如何,我所做的是有一个变量,它包含我需要等待的对象的数量,当其中一个对象完成时,只需减少它,然后检查它是否为0,如果是,我可以调用另一个函数。

根据
$。当所有参数都已解析或参数的一个时,
触发回调m被拒绝。那么用类似的东西代替
$怎么样。当
:

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);
    });
};
你可以这样使用它:

custom_when(a1, a2, a3, function() {
    // do some stuff.
});

还有。

我知道您在这里试图做什么,但没有方便的方法。这是有效的:

$.when(a1).done(a2).done(a3).then(function(){

$('body')。追加('defer always我实际上也有同样的想法。我真的很想避免它,我想只是为了更干净的代码。谢谢你的反馈。我很高兴看到你的解决方案,以防没有其他人知道如果没有解决方法,这是可能的。这是我需要它时找到的唯一方法。以防你还没有r阅读此线程:这看起来不错。也感谢fiddle演示。我要到今晚或明天才能在我的构建中实现它。但一旦我实现了,我会回来报告。感谢你的函数和fiddle。我将很快测试它,并会回来报告。
custom_when(a1, a2, a3, function() {
    // do some stuff.
});
$.when(a1).done(a2).done(a3).then(function() {
    $('body').append('defer always <-- should be after all<br />'); 
});
whenAllResolved(a1, a2, a3).done(function () {
    $('body').append('defer always <-- should be after all<br />');
});


function whenAllResolved(){
    var d = $.Deferred(),
        args = arguments,
        verifyDeferreds = function(){
            var allResolved = true;
            $.each(args, function(i, arg){
                if(arg.state() === 'pending'){
                    allResolved = false;
                    return false;
                }
            });
            if (allResolved){
                d.resolve();
            }
        };

    $.each(arguments, function(i, arg){
        arg.always(verifyDeferreds);
    });

    verifyDeferreds();

    return d;
}