听多个承诺来完成

Listen for multiple promises to complete

本文关键字:承诺      更新时间:2023-09-26

这在第一次调用时很好,但无论我是否"重置"延迟对象,$.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/

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

代码的问题在于,您没有"重置"延迟对象(事实上,它们不能被重置(——您正在用对其他(未解决的(延迟的引用替换对这些对象的一些引用。

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