使用jQuery延迟到链异步函数

使用jQuery延迟到链异步函数,jquery,jquery-deferred,Jquery,Jquery Deferred,我正在尝试使用jQuery$。Deferred将函数链接在一起,方法是使用then 我已经通读了文档,非常确定我在某个地方犯了一个愚蠢的错误,但是我不能让函数second等待first完成 HTML JS(jQuery 2.1) 函数优先(){ let deferred=$.deferred(); setTimeout(函数(){//任何异步函数。 $('ul')。追加('li>First'); 延迟。解决(); }, 500); 延迟返回。承诺(); } 函数秒(){ let defer

我正在尝试使用jQuery
$。Deferred
将函数链接在一起,方法是使用
then

我已经通读了文档,非常确定我在某个地方犯了一个愚蠢的错误,但是我不能让函数
second
等待
first
完成

HTML

JS(jQuery 2.1)

函数优先(){
let deferred=$.deferred();
setTimeout(函数(){//任何异步函数。
$('ul')。追加('li>First');
延迟。解决();
}, 500);
延迟返回。承诺();
}
函数秒(){
let deferred=$.deferred();
$('ul')。追加('li>秒');
延迟。解决();
延迟返回。承诺();
}
$(函数(){
$.when(first()).done().then(second());
})
实际上,我希望保持链接(因此在
第二节中也有承诺)

JSFiddle:

有什么想法吗?感谢您的advanced。

删除
回调函数中
第二个
函数的括号
()
。否则,您将直接执行
second
函数,而不是在承诺解决时执行

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

实际上,当你只有一个承诺时,使用
$.when()
是没有意义的。只需直接使用
。然后()

 first().then(second);
对于第二个
,必须传递函数引用,这意味着只传递函数名。如果后面有
()
,则它会立即执行并传递返回结果,而不仅仅是传递以后可由
.then()
基础结构调用的函数引用

$.when()
只有在您有多个承诺并且希望知道所有承诺何时都完成时才真正有用。当您只有一个承诺时,您可以直接在该承诺上使用
.then()
。注意,我切换到了
.then()
,这是ES6使用承诺的标准方式(由jQuery支持),而不是使用特定于jQuery的
.done()

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