非常简单的问题,我想我可以解决这个问题,但答案已经没有了。
是否可以清除/删除已完成/失败/始终排队的延迟对象的附加处理程序。
var dfd = $.Deferred()
dfd.done(foo).fail(bar);
// User interacts with the page in a way that I do not want to fire foo or bar
// when dfd is resolved or rejected
<<answer here>>
答案 0 :(得分:2)
我的猜测是否定的,但我不会发誓。无论如何,你可以完成至少部分(如果不是全部)你想要的功能。
您始终可以通过$.when
设置等待多个延迟。所以,而不是
var dfd= $.Deferred();
dfd.done(foo).fail(bar);
你有
var dfd= $.Deferred();
var userfailedtointeract= $.Deferred();
$.when(dfd,userfailedtointeract).done(foo);
您解决userfailedtointeract
之后,可以安全地拨打foo或拒绝
但是,这并不会有条件地调用bar
,因为将.fail(bar)
添加到上述$.when
行意味着bar
会在任何一个承诺被拒绝时触发。只有在bar
解决后,您才希望userfailedtointeract
触发失败!
这引出了以下内容:
var dfd= $.Deferred();
var userfailedtointeract= $.Deferred();
userfailedtointeract.done(function(){
dfd.done(foo).fail(bar);
});
其中......实际上并不像我想的那样难以解决。但我正以失眠的眼光看着这个。我可能会遗漏一些东西。
答案 1 :(得分:1)
不,没有机制可以删除$.Deferred()
上已注册的回调。
大多数情况下,您只能访问延迟的.promise()
接口,这只允许您注册回调并读取承诺的状态 - 您不能通过任何修改承诺暴露的方法。
在您的情况下,您将需要这些已注册的回调来检查由用户交互更改的其他状态变量,然后让他们决定是否继续。
答案 2 :(得分:0)
你可能只是看错了。看起来你真正想做的就是取消(中止)XHR,这样你的延迟就可以被忽略了。
关于类似问题的答案显示了这样一个例子:https://stackoverflow.com/a/11863085/545296