【发布时间】:2012-09-12 16:21:38
【问题描述】:
我无法将已完成的 Deferred 与 $.when() 同步。 我希望在所有延期完成时收到通知,无论是解决还是失败。
我的问题是 when().always() 最初触发失败并且不等待其他延迟完成。不知道是不是bug。
我做了一个例子,这是一个 JsFiddle: http://jsfiddle.net/m3REv/
其中的js代码:
/* our multiple deferred we'd like to sync. */
var def1 = $.Deferred();
var def2 = $.Deferred();
var def3 = $.Deferred();
def1.done( function() { logger.log('1 done');} ).fail( function() {logger.log('1 fail');} );
def2.done( function() { logger.log('2 done');} ).fail( function() {logger.log('2 fail');} );
def3.done( function() { logger.log('3 done');} ).fail( function() {logger.log('3 fail');} );
$.when( def1, def2, def3 ).then( function() {
logger.log('w then');
} ).done( function() {
logger.log('w done');
} ).fail( function() {
logger.log('w fail');
} ).always( function() {
logger.log('w always');
});
def1.reject();
def2.resolve();
def3.resolve();
输出是:
1 fail
w fail
w always
2 done
3 done
【问题讨论】:
-
这不是错误。 The docs 声明
when()在第一个观察到的承诺失败时失败。when()返回的承诺失败是解决它,所以它的always()触发。不知道如何解决这个问题,您可能需要实现自己的when-like 构造。 -
好吧,那就是缺乏。我终于找到了一张相关的票:bugs.jquery.com/ticket/9386,但他们不会实现某些东西,直到有人先想出一个插件。 叹息