清除/删除附加处理程序到$ .Deferred Objects

时间:2013-10-24 08:23:38

标签: jquery jquery-deferred

非常简单的问题,我想我可以解决这个问题,但答案已经没有了。

是否可以清除/删除已完成/失败/始终排队的延迟对象的附加处理程序。

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>>

3 个答案:

答案 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