在jQuery中取消延迟的Promise

rip*_*234 11 javascript jquery promise jquery-deferred

如何在不从DOM中删除元素的情况下取消承诺?

小提琴

我运行了这段代码:

$("#box")
  .delay(2000)
  .show("slow")
  .delay(2000)
  .promise()                            
  .then(function(){log("Done");});
Run Code Online (Sandbox Code Playgroud)

在此之后,有没有办法取消承诺?双方clearQueue()stop(true)没有工作,因为这不是我想要取消的动画.我看到remove()应该这样做......但我只想停止承诺,而不是删除整个元素.

小智 4

好消息。从昨天开始你可以取消你的承诺。

我发布了我的小插件jquery-timing的新版本,它提供了两种方法,其中包括 .wait() 和 .unwait()。

var deferred = $("#box").delay(2000).show("slow").delay(2000).promise();
$.wait(deferred, function(){ log("Done"); });
Run Code Online (Sandbox Code Playgroud)

如果您想取消注册回调:

$.unwait();
Run Code Online (Sandbox Code Playgroud)

这些静态版本的 wait 和 unwait 还支持可选的组名称,以便不取消任何处理程序,而仅取消特定的集合。

除此之外,你还可以做很多更聪明的事情,例如:

$('#box').wait(deferred).addClass('ready');
Run Code Online (Sandbox Code Playgroud)

或一条链中的整个代码,没有 unwait 选项:

$("#box").delay(2000).show("slow")
  .delay(2000).join(function(){log("Done");})).addClass('ready');
Run Code Online (Sandbox Code Playgroud)

或者相同甚至更短,可以选择取消两次暂停:

$("#box").wait(2000).show("slow",$)
  .wait(2000, function(){log("Done");})).addClass('ready');
Run Code Online (Sandbox Code Playgroud)

只需查看最适合您的文档、示例和 API。