在延迟对象的回调之前,我无法在每个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同样的结果.一旦一个请求被拒绝,它就会在等待其他回调之前触发失败回调.
根据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)