0

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

我有一个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的最佳实践的搜索,但我找不到任何东西所以,你提供什么?

4

2 回答 2

2

使用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
]);

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

于 2020-09-07T03:34:51.317 回答
-2

我没有使用过这样的构造,但是如果你不喜欢它,你可以将你的promise.all 包裹在另一个promise 中,这样就不会嵌套promise all。

于 2020-09-06T21:13:09.083 回答