取消jQuery中的延期承诺

Canceling a Deferred Promise in jQuery

本文关键字:承诺 jQuery 取消      更新时间:2023-09-26

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

小提琴

我运行了这个代码:

$("#box")
  .delay(2000)
  .show("slow")
  .delay(2000)
  .promise()                            
  .then(function(){log("Done");});

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

好消息。从昨天起,你可以取消你的承诺。

我发布了我的小型插件jquery timing的新版本,其中提供了两个方法,分别称为.wait()和.unwait(

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

如果您想注销回调:

$.unwait();

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

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

$('#box').wait(deferred).addClass('ready');

或者整个代码在一个链中,没有未洗选项:

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

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

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

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

我相信你可以使用$('#box').remove();

从这里的jQuery文档:http://api.jquery.com/promise/

返回的Promise链接到元素的.data()上存储的Deferred对象。由于.remove()方法删除元素的数据以及元素本身,因此它将阻止任何未解析的元素Promises进行解析。如果需要在解析Promise之前从DOM中移除元素,请改用.destrict(),并在解析后使用.removeData()。"

我想你不会想要这样的东西http://jsfiddle.net/2cq8M/?我涉及两个承诺(一个只是在动画集结束时处理案件,另一个是根据需要解决或拒绝)。

在这种情况下,您希望使用deferred而不是promise,但是,您可以使用动画的promise来解决deferred。

http://jsfiddle.net/LG9eZ/9/

var stopDone = true;
function log(msg) {
    $(".debug").append(new Date() + " - " + msg + "<br/>");
}
log("Starting");
var boxAnimation = new $.Deferred();
boxAnimation.done(function() {
    log("Done");
});
boxAnimation.fail(function() {
    log("Stopped");
});

$("#box").delay(2000).show("slow").delay(2000).promise().then(function() {
    boxAnimation.resolve(); // when all the animations are done, resolve the deferred.
}); 

if (stopDone)
{
    boxAnimation.reject();
}

附带说明一下,延期只能被拒绝或解决一次。一旦他们被拒绝或解决,你就不能改变他们的状态。