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

问题描述 投票:1回答:1

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

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

它是这样的吗?谢谢。

javascript jquery promise
1个回答
2
投票

$.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>
© www.soinside.com 2019 - 2024. All rights reserved.