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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jQuery承诺,如何检查then()是否真的在when()之后?相关的知识,希望对你有一定的参考价值。

这可能只是我在艰难的过程中学到的一课,但我只想与大家一起确认。

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');});

延迟后只打印cab不是。 JSFiddle

它是这样的吗?谢谢。

答案

$.when()的论据应该是一个承诺 - 你做对了,因为a()回归了一个承诺。

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

表达式.then(b())马上执行b(),所以它不会等到5s,直到a()的承诺得到解决。当你有.then(b)时,调用b()只会在a()的承诺得到解决后发生,这就是你想要的。

所以只需将.then(b())更改为.then(b)就会按预期运行(打印a,等待5s,打印b,再等5s,打印c):

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');});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

以上是关于jQuery承诺,如何检查then()是否真的在when()之后?的主要内容,如果未能解决你的问题,请参考以下文章

JS/jQuery 承诺

如何在 JS 中使用 try、catch、.then 链接和异步等待来解决承诺?

承诺,如何将变量传递给 .then 函数

链接承诺不会将数据从一个 .then 传递到下一个

执行 .Then() 承诺 NodeJS

承诺仍在 then 块中待处理 - 如何解决? [复制]