簡體   English   中英

在jQuery中取消延遲的Promise

[英]Canceling a Deferred Promise in jQuery

如何在不從DOM中刪除元素的情況下取消承諾?

小提琴

我運行了這段代碼:

$("#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()方法刪除了元素的數據以及元素本身,因此它將阻止任何元素的未解析的Promise解析。 如果在解析Promise之前需要從DOM中刪除一個元素,請使用.detach()代替並在解析后使用.removeData()。“

您希望在此情況下使用延遲而不是承諾,但是,您可以使用動畫的承諾來解決延遲。

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();
}

作為旁注,延期只能拒絕或解決一次。 一旦他們被拒絕或解決,你就無法改變他們的狀態。

我不認為你想要像http://jsfiddle.net/2cq8M/這樣的東西? 我涉及兩個承諾(一個只是在動畫集的末尾處理案例,另一個是根據需要解決或拒絕)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM