如何解决Promise.all中的.then附加的Promise
我对诺言的解决感到困惑。如果我创建了一个Promise数组,并向所有Promise提供了.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也会启动控制台日志“完成”吗? 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")));
解决方法
即使Promise.all()完成,promise也会启动控制台日志记录“完成”吗? Promise.all()的.then()是一个单独的.then(),仅在所有承诺都解决后才能运行吗?
是的。推送到数组的Promise会在它们的done
被记录后 全部解析,因此,在Promises数组上调用Promise.all
将导致all done
始终被在每个done
登录后登录。
从所有单独的Promise中删除.then()并改为在Promise.all()的.then()中执行此代码有什么区别,如下所示?有性能折衷吗?
主要区别在于,在第一种方法中,done
可在其先前的Promise完成后立即记录 。相反,在第二种方法中:
Promise.all(promiseArray).then((resolves) => resolves.forEach(
以上,所有承诺必须解决,然后再开始遍历它们。
这很可能是一个重要因素。例如,假设您必须为每个Promise结果执行CPU密集型计算。在这种情况下,采用第二种方法绝对是更好的选择,因为这样您就可以在等待其他Promise解决的同时进行一些计算,而不必等待 all 所有Promise在开始第一次计算之前先解决。
Here's an example,其中使用第二种方法是对第一种方法的坚实改进。如果计算成本很高,则将它们链接到各个Promises 上,而不是放在Promise.all
之后。
(如果要在单个Promises之后运行的代码并不昂贵,那就没关系-您可以选择最易读的方法)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。