【问题标题】:Promise attached with .then() in Promise.all()Promise.all() 中带有 .then() 的 Promise
【发布时间】:2021-01-19 05:12:28
【问题描述】:

我对承诺的解决感到困惑。如果我创建了一个承诺数组并为所有承诺提供了一个 .then() ,如下所示..

// assume async() returns a promise that resolves with the number 5. 
promiseArray = [];
for (let i = 0; i < 5; i++){
promiseArray.push(async(5).then(() => console.log("done")));
}
Promise.all(promiseArray).then(() => console.log("all done"));

我对这里发生的事情感到困惑。承诺是否在 Promise.all() 完成之前就开始控制台记录“完成”? Promise.all() 的 .then() 是否是一个单独的 .then(),仅在所有承诺解决后才运行?

从所有单独的 Promise 中删除 .then() 并在 Promise.all() 的 .then() 中执行此代码有什么区别,如下所示?是否有任何性能权衡?

// assume async() returns a promise that resolves with the number 5. 
promiseArray = [];
for (let i = 0; i < 5; i++){
promiseArray.push(async(5));
}
Promise.all(promiseArray).then((resolves) => resolves.forEach(console.log("done")));

【问题讨论】:

  • async 函数是什么?
  • 我已经编辑了帖子,但只是说 async 返回了一个以数字 5 解析的承诺。这只是一个假设示例。
  • 如果您对承诺的解决感到困惑,记录在案:Promise resolution procedure

标签: javascript asynchronous promise es6-promise


【解决方案1】:

承诺是否在 Promise.all() 完成之前就开始控制台记录“完成”? Promise.all() 的 .then() 是否是一个单独的 .then(),仅在所有承诺解决后才运行?

没错。被推送到数组的 Promise 都在它们的 done 被记录后解析,因此在 Promise 数组上调用 Promise.all 将导致 all done 总是在每个 done 之后被记录已登录。

从所有单独的 Promise 中删除 .then() 并在 Promise.all() 的 .then() 中执行此代码有什么区别,如下所示?是否有任何性能权衡?

主要区别在于,在第一种方法中,dones 可以在其先前的 Promise 完成后立即记录。相比之下,在第二种方法中:

Promise.all(promiseArray).then((resolves) => resolves.forEach(

以上,所有 Promises 必须先解决,然后再开始对其进行迭代。

这很可能是一个重要因素。例如,假设您必须为每个 Promise 结果执行 CPU 密集型计算。在这种情况下,采用第二种方法肯定是更好的选择,因为这样您就可以在等待其他 Promise 解决的同时执行其中一些计算,而不是必须等待 all Promises在开始第一次计算之前解决。

Here's an example 其中使用第二种方法是对第一种方法的可靠改进。当计算开销很大时,将它们链接到单个 Promises,而不是在 Promise.all 之后。

(如果在单个 Promise 之后运行的代码并不昂贵,那么没关系 - 您可以选择您认为最易读的任何方法)

【讨论】:

  • 对于您的示例,您的意思是说 first 方法是对 second 的改进吗?
  • 错字,你是对的。尽可能链接到单个 Promise,不要链接到 Promise.all
猜你喜欢
  • 2018-07-25
  • 2018-02-06
  • 2018-04-05
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-01
相关资源
最近更新 更多