2016-08-15 45 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()