听取多个承诺完成

时间:2014-05-19 12:32:27

标签: javascript jquery

这适用于第一次调用,但无论我是否“重置”延迟对象,$.when只会触发一次,除非我在点击处理程序中重新绑定它。

有没有办法让几个承诺的全局监听器可以重置?

我也考虑过自定义事件和发布/子模式。它们适用于单个事件,但我无法找到一种在下面的场景中使用它们的好方法。

var dfd1 = $.Deferred(), dfd2 = $.Deferred();

$('input').on('click', function(){
    dfd1 = $.Deferred();
    dfd2 = $.Deferred();
    f1();
    f2();
});

$.when.apply($, [dfd1, dfd2]).then(function(schemas) {
    console.log('done');
});

function f1(){
    setTimeout(dfd1.resolve, 500);
}

function f2(){
    setTimeout(dfd2.resolve, 600);
}

f1();
f2();

http://jsfiddle.net/C62gh/

1 个答案:

答案 0 :(得分:1)

TL; DR:每次创建新的延迟时,都必须再次呼叫$.when

您的代码的问题在于您没有“重置”延迟对象(实际上它们无法重置) - 您正在使用对其他对象的引用替换对这些对象的一些引用(未解决的)延期。

请注意,我说一些引用,因为您要替换的引用不是唯一的:传递给$.when的数组包含对相同延迟的单独引用,并且这些引用具有当然没有被取代。即使他们有,$.when也无法知道,即使它想要。