2016-08-15 18 views
1

我試圖用jQuery $.Deferred使用then將函數鏈接在一起。使用jQuery推遲鏈式異步功能

我已經通讀了文檔,很確定我在某個地方犯了一個愚蠢的錯誤,但我無法獲得功能second來等待first完成。

HTML

<ul> 

</ul> 

JS(jQuery的2.1)

function first() { 
    let deferred = $.Deferred(); 
    setTimeout(function() { // Any async function. 
     $('ul').append('<li>First</li>'); 
     deferred.resolve(); 
    }, 500); 
    return deferred.promise(); 
} 

function second() { 
    let deferred = $.Deferred(); 
    $('ul').append('<li>Second</li>'); 
    deferred.resolve(); 
    return deferred.promise(); 
} 

$(function() { 
    $.when(first()).done().then(second()); 
}) 

在現實中,我想保留鏈接(因此second承諾爲好)。

的jsfiddle:https://jsfiddle.net/jdb1991/n3aory8c/

任何想法?先謝謝了。

回答

1

刪除then()回調中的second函數的括號()。否則,您將直接執行second函數,而不是在承諾解決時執行。

$.when(first()).done().then(second); 

Working example.

+0

謝謝!對我而言,這是一個愚蠢的疏忽。 – jdborg

+0

不客氣,@jdborg! – eisbehr

1

其實,有一個在使用$.when()在所有當你只有一個承諾沒有意義。只需使用.then()直接:

first().then(second); 

而且,對於second,你必須通過一個函數引用,這意味着你只需通過函數名稱。如果您之後有(),則立即執行並傳遞返回結果,而不僅僅是傳遞稍後可由.then()基礎結構調用的函數引用。

$.when()只有在您有多個承諾並且您想知道何時完成所有承諾時纔有用。當您只有一個承諾時,您可以直接在該承諾上使用.then()。請注意,我切換到.then()這是使用promise(並且由jQuery支持)的ES6標準方式,而不是使用特定於jQuery的.done()