Javascript jQuery承诺,如何检查then()是否真正在when()之后?

Javascript jQuery承诺,如何检查then()是否真正在when()之后?,javascript,jquery,promise,Javascript,Jquery,Promise,这可能只是我从中学到的一个教训,但我只想向大家证实这一点 function a() { var dtd = $.Deferred(); console.log('a'); setTimeout(() => { dtd.resolve(); }, 5000); return dtd.promise(); } function b() { var dtd = $.Deferred(); console.log('b'); setTimeout

这可能只是我从中学到的一个教训,但我只想向大家证实这一点

function a() {
  var dtd = $.Deferred(); 
  console.log('a');
  setTimeout(() => {
    dtd.resolve(); 
  }, 5000);
  return dtd.promise(); 
}  
function b() {
  var dtd = $.Deferred(); 
  console.log('b');
  setTimeout(() => {
    dtd.resolve(); 
  }, 5000);
  return dtd.promise(); 
}    

$.when(a()).then(b()).done(function () {console.log('c');});
延迟后只打印
c
a
b
不打印。


是这样吗?谢谢。

的参数
$。when()
应该是一个承诺-您做得对,因为
a()
返回一个承诺

但是
.then()
实际上将函数作为参数。也就是说,您应该通过
b
,而不是
b()
的结果

表达式
。然后(b())
立即执行
b()
,因此它不会等待5秒,直到
a()
的承诺得到解决。当您有
。然后(b)
,调用
b()
只会在
a()
的承诺得到解决后发生,这正是您想要的

因此,只需更改
。然后(b())
。然后(b)
将按预期运行(打印
a
,等待5s,打印
b
,再等待5s,打印
c
):

函数a(){
var dtd=$.Deferred();
console.log('a');
设置超时(()=>{
dtd.resolve();
}, 5000);
返回dtd.promise();
}  
函数b(){
var dtd=$.Deferred();
console.log('b');
设置超时(()=>{
dtd.resolve();
}, 5000);
返回dtd.promise();
}    
$.when(a()).then(b).done(函数(){console.log('c');})

事情总是这样。您在这里的预期输出是什么?a会在5s后打印,然后b&c会在5s后打印?我想应该是a…5s…b…5s…c