【问题标题】:2 promises run simultaneously when 'return' is not used不使用“return”时,2 个 Promise 同时运行
【发布时间】:2019-10-01 18:31:20
【问题描述】:

如果我在 JS 中执行异步操作并链接 2 个 .then 调用,当我在第一个 .then 的异步操作上使用 return 关键字时,执行会按预期进行:

  1. 第一个异步操作在 x 时间后执行
  2. 第二个异步操作在 x 时间后执行

但是,如果第一个 .then 中的异步操作没有明确使用 return,则两个操作同时完成,在初始异步操作后 x 时间量,例如:

场景 1:

function doAsync() {
  return new Promise(res => {
    setTimeout(() => res('hi'), 3000);
  });
}

doAsync().then(() => {
  console.log('async then 1'); // executes 3 seconds after 
  return doAsync();
}).then(() => {
  console.log('async then 2'); // executes 6 seconds after
});

场景 2:

function doAsync() {
  return new Promise(res => {
    setTimeout(() => res('hi'), 3000);
  });
}

doAsync().then(() => {
  console.log('async then 1'); // executes 3 seconds after 
  doAsync(); // no return
}).then(() => {
  console.log('async then 2'); // executes 3 seconds after
});

这是为什么? return 是否表示在继续第二个承诺之前等待第一个承诺解决?所以如果跳过返回,第二个异步操作在等待第一个承诺解决之前开始?

【问题讨论】:

  • does return signify to wait for the first promise to resolve - 不是真的......因为doAsync返回一个承诺,.then返回的承诺“采用”doAsync的值......因此直到这个承诺解决了
  • 您可能需要阅读有关Promise Chaining的文档
  • 或阅读promisesaplus.com的承诺解决程序

标签: javascript asynchronous promise


【解决方案1】:

如果您省略 return 关键字,第二个 doAsync() 将立即安排,而第一个 then 退出。

如果你省略了 return 关键字,你就没有链接你的 Promise。

【讨论】:

  • 您有这方面的参考资料以便我确认吗?因为你描述的是我看到的行为
  • @duxfox-- 我在评论中链接了涵盖此确切行为的文档...
  • 你能指出确切的位置吗,因为我阅读了文档并没有看到相同的确切场景 - 我阅读了标题为“时间”的部分
猜你喜欢
  • 2018-12-28
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多