【发布时间】:2014-05-30 09:56:42
【问题描述】:
根据http://api.jquery.com/jquery.when/ $.when() 应该在其中一个 Deferred 被拒绝后立即拒绝 master Deferred。为什么在“捕获 OnPreRenderFailed”消息之前,我会收到所有 4 条 console.log 消息。
我的理解是,一旦第二次延期被拒绝,我就不应该得到console.log('third deferred'); 和console.log('fourth deferred'); 或者在console.log('caught OnPreRenderFailed');之后得到它们
除非我非常幸运(或没有)让方法一直以 (1,3,4,2) 顺序触发。我一定在这里遗漏了什么。
JSFiddle
$(document).on('OnPreRenderResolved', function () {
console.log('caught OnPreRenderResolved');
});
$(document).on('OnPreRenderFailed', function () {
console.log('caught OnPreRenderFailed');
})
$(document).on('OnPreRender', function (e, options) {
console.log('OnPreRender fired');
options.callback();
});
$(document).trigger('OnPreRender', {
callback: function () {
$.when.apply($, [$.Deferred(function (deferred) {
console.log('first deferred');
deferred.resolve();
}), $.Deferred(function (deferred) {
console.log('second deferred');
deferred.reject();
}), $.Deferred(function (deferred) {
console.log('third deferred');
deferred.resolve();
}), $.Deferred(function (deferred) {
console.log('fourth deferred');
deferred.resolve();
})]).then(function () {
$(document).trigger("OnPreRenderResolved");
}, function () {
$(document).trigger("OnPreRenderFailed");
})
}
});
【问题讨论】:
-
您将获得 4 个日志,因为您并行触发了 4 个函数。就那么简单。现在的问题是:你想达到什么目的?通常
$.when中的工作应该是独立的。你的意思是他们应该取决于其他人是否成功。如果是这样,那么您不应该使用$.when,而是将它们链接起来。
标签: javascript jquery jquery-deferred