簡體   English   中英

推遲jQuery.each結果

[英]Deferreds on jQuery.each result

我正在學習延期,並且無法弄清楚它的工作方式/原因:

<html>
<head>
</head>
<body>
    <div>
        1</div>
    <div>
        2</div>
    <div>
        3</div>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    <script>
        $("div").each(function (i) {
            $(this).delay(1000 * i).fadeOut();
        }).promise().done(function () { console.log("it's done"); });
</script>
</body>
</html>

特別是: 為什么我每次都稱呼諾言? 為什么在技術上可行? 我console.logged:

console.log($("div").each(function (i) {}));

我確實在原型中看到了promise方法。 但是,我的每個函數都不返回任何值,只是一個:

$(this).delay(1000 * i).fadeOut();

那么如何將諾言與動畫結果聯系起來? (基本上是每次迭代的結果)

編輯1:為了清楚起見,也許我應該這樣寫我的問題:

完成所有動畫后調用done方法的方式==如何將promise與每個回調函數內部執行的動畫互連。

我從未見過each都與承諾一起使用,而只有動畫

$('div') 
.animate({opacity: 0}, 1500) // animate all divs at once
.promise()
.done(function(){ 
   console.log('all done');
});

這將立即為所有div設置動畫,然后在所有div完成動畫制作后執行回調。 循環內的動畫的問題在於,它無法協調,如果不使用諾言,您將無法控制它們何時完成。 如果你真的想使用each ,你必須做出的一個數組promises ,然后用then

 var promises = [];
 $('div').each(function(){
    var $this = $(this);
    promises.push($this.fadeOut('slow').promise());
 });

 $.when.apply($, promises).then(function(){
   console.log('all done');
 });

這與執行$('div').fadeOut('slow', function(){ alert('done'); }); 因為回調將針對每個動畫的EACH元素發生,而Promise的處理就像是一個包含許多子任務的“任務”

http://jsfiddle.net/LbHrQ/3/

Promise的最佳用途是當您想要自然地同步一些異步操作(例如動畫,ajax,使用超時的事物)(在這種情況下,您需要手動resolve() Deferred)

您是否嘗試過加入promise()的方法? 目前,您僅在所有迭代完成后才執行它。

$("div").each(function (i) {
   $(this).delay(1000 * i).fadeOut().promise().done(function () { console.log("This individual animation is done."); });
}).promise().done(function () { console.log("Everything is done."); });

選擇器div實際上引用了頁面上的很多元素。 遍歷所有這些元素時,它將對此元素執行特定的操作。

然后,您要做的是讓與這些元素相關的所有先前操作完成后,讓jQuery執行另一個操作。 根據他們的文檔,它返回一個對象:

當綁定到集合的某種類型的所有動作(無論是否排隊)都已完成時。

因此,在集合中執行完每個 fadeOut()之后,會激活console.log()

暫無
暫無

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

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