这适用于第一次调用,但无论我是否“重置”延迟对象,$.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();
答案 0 :(得分:1)
TL; DR:每次创建新的延迟时,都必须再次呼叫$.when
。
您的代码的问题在于您没有“重置”延迟对象(实际上它们无法重置) - 您正在使用对其他对象的引用替换对这些对象的一些引用(未解决的)延期。
请注意,我说一些引用,因为您要替换的引用不是唯一的:传递给$.when
的数组包含对相同延迟的单独引用,并且这些引用具有当然没有被取代。即使他们有,$.when
也无法知道,即使它想要。