并行解决承诺

Posted

技术标签:

【中文标题】并行解决承诺【英文标题】:Parallel resolution of promises 【发布时间】:2020-02-17 06:05:27 【问题描述】:

如果我有一些要并行解决的承诺。我可以使用 Promise.all() 解决它们。但是,如果这些 Promise 内部也有需要解决的 Promise 怎么办?它们会自动解决还是我必须在 Promise.all() 之前手动解决它们?

另外,解决承诺的首选方法是什么? 1. 收集它们然后使用 Promise.all() 2. 创建 Promise 并等待它们自行解决?

【问题讨论】:

不看代码很难说 "我可以使用 Promise.all() 解决它们" - 不,Promise.all 不能解决任何问题,promise 需要自己解决。 Promise.all 只创建一个新的承诺,它将等待所有的输入。 我猜你对多线程环境感到困惑。 js 中只有一个单线程事件循环,所以并行性很难,除非你使用 process.fork() 只要你解决了每个promise中的嵌套promise,一切都很好。 【参考方案1】:

您可能需要单独解析父级中的每个承诺,以确保 Promise.all 能够很好地捕获它。

例如,

const nestedAsyncChild = new Promise(resolve => resolve(someMethod));
const asyncChild = new Promise(resolve => resolve(nestedAsyncChild));

const parent1 = new Promise(resolve => resolve(asyncChild));
const parent2 = new Promise(resolve => resolve(asyncChild));
const parent3 = new Promise(resolve => resolve(asyncChild));

Promise.all([parent1, parent2, parent3])
.then(a => 
  console.log("Success");
)
.catch(() => 
  console.error("Error");
);

更新

如果有人对某个答案投了反对票,他们应该有共同的礼貌来告诉这个人为什么这样做。把人赶出答题板没有帮助!

【讨论】:

以上是关于并行解决承诺的主要内容,如果未能解决你的问题,请参考以下文章

并行承诺的自定义错误处理

如何在没有“快速失败”行为的情况下并行等待多个承诺? [复制]

GWT RPC - 并行异步调用

当其中一些得到解决时,解决合并后的承诺

调试并行运行的 Promise 的最佳方法

SPA 可以针对单个 GraphQL 服务器发出并行异步查询吗?