首页 > 解决方案 > 嵌套的 promise.all

问题描述

我正在尝试改善一些性能问题,为此我尝试执行以下操作

我有一个promises数组,我想在 promises 数组的所有 promises 完成后返回结果。

顺便说一句,processA、processB 和 processC 的结果也很重要,因为在 // 其他逻辑我在某个地方使用它们。

const promiseResults = await Promise.all(promises);

 const [processA, processB, processC] = await Promise.all([
      asyncProcessForA(),
      asyncProcessForB(),
      asyncProcessForC(),
 ]);



 // other logic 
 // ....
 // ....


 return promiseResults;

所以,我想在 promise.all 中添加 promiseResults

const [promiseResults, processA, processB, processC] = await Promise.all([
      Promise.all(promises),
      asyncProcessForA(),
      asyncProcessForB(),
      asyncProcessForC(),
 ]);


 // other logic 
 // ....
 // ....


 return promiseResults;

那么,我的方式是否好用,并且还使用嵌套的 promise.all是一种好方法吗?因为我做了一些使用嵌套promise.all的最佳实践的搜索,但我找不到任何东西所以,你提供什么?

标签: javascriptnode.jspromiseasync-awaitpromise.all

解决方案


使用Promise.all()第二个示例中所示的嵌套:

const [promiseResults, processA, processB, processC] = await Promise.all([
      Promise.all(promises),
      asyncProcessForA(),
      asyncProcessForB(),
      asyncProcessForC(),
]);

工作得很好。 Promise.all()期望一系列的承诺。由于Promise.all()返回一个承诺,在另一个调用中使用它的承诺是完全可以的Promise.all()。这里的一个问题是你的外部Promise.all()将解析为一个包含嵌入式数组的数组,如下所示:

[[v1, v2, v3], valueA, valueB, valueC]

[v1, v2, v3]内部解决的结果在哪里Promise.all()(传递给外部 Promise.all() andvalueA, valueB, valueC are the resolved results from the other promises passed to the outerPromise.all()`。所以,只要你准备好像这样组织结果,你当然可以这样工作。


您还可以展平结果并执行以下操作:

const [processA, processB, processC, ...promiseResults] = await Promise.all([
      asyncProcessForA(),
      asyncProcessForB(),
      asyncProcessForC(),
      ...promiseResults
]);

然后,这将为您提供一个组合的扁平结果数组,然后您可以根据需要分配或访问这些结果。因此,这实际上仅取决于您希望如何组织结果。


推荐阅读