11

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

小提琴

我运行了这段代码:

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

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

4

4 回答 4

4

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

我发布了我的小插件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。

于 2012-08-09T04:40:04.097 回答
2

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

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

返回的 Promise 链接到存储在元素的 .data() 上的 Deferred 对象。由于 .remove() 方法会删除元素的数据以及元素本身,因此它将阻止元素的任何未解析的 Promise 解析。如果有必要在其 Promise 解决之前从 DOM 中删除一个元素,请使用 .detach() 代替,并在解决后使用 .removeData() 。

于 2012-03-08T00:16:25.263 回答
1

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

于 2012-03-08T00:45:44.420 回答
1

在这种情况下,您想使用 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();
}

作为旁注,延期只能拒绝或解决一次。一旦它们被拒绝或解决,您就无法更改它们的状态。

于 2012-04-17T14:43:12.123 回答