11

非常简单的问题,以为我可以解决这个问题,但答案却让我找不到。

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

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

3 回答 3

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当任何一个 Promise 被拒绝时触发。只有解决了,您才想bar在失败时触发userfailedtointeract

这使我们得出以下结论:

var dfd= $.Deferred();
var userfailedtointeract= $.Deferred();
userfailedtointeract.done(function(){
    dfd.done(foo).fail(bar);
});

哪个...实际上并不像我想象的那样是一个很难的解决方案。但我用失眠的眼睛看着这个。我可能会遗漏一些东西。

于 2013-10-24T09:06:15.293 回答
2

不,没有机制可以删除$.Deferred().

大多数时候,您只能访问.promise()deferred 的接口,这仅允许您注册回调并读取 promise 的状态 - 您不能通过任何公开的方法修改promise。

在您的情况下,您将需要那些注册的回调来检查由用户交互更改的其他一些状态变量,然后让他们决定是否继续。

于 2013-10-24T09:07:27.517 回答
0

你可能只是看错了问题。看起来您真正想要做的是取消(中止)XHR,以便可以忽略您的延迟。

This answer on a similar question显示了一个例子:https ://stackoverflow.com/a/11863085/545296

于 2013-10-24T14:37:07.667 回答