繁体   English   中英

在 Promise.all() 中编写多个映射函数

[英]Writing multiple map functions in Promise.all()

我在一个方法中有两个 Promise.all() 工作块。 我想将这两个 Promise.all() 合二为一。 单个 Promise.all() 包括一个执行异步任务的映射函数。 例子:

let obj1 = [], obj2 = [];
await Promise.all(container1.map(async (item)=>{
   obj1.push(await dbCall(item));
}))

await Promise.all(container2.map(async (item)=>{
   obj2.push(await dbCall(item));
}))

上面的块填充了 dB 以及本地容器 (obj1,obj2)

然而,在单个 Promise.all([map1,map2]) 中包含这两个 map 函数不会填充本地容器 (obj1,obj2)(dB 按预期更新)

如何在单个 Promise.all() 中包含两个映射函数?

您首先尝试合并两个数组,然后

let obj = [];
container1.foreach((item)=>{
    obj.push(dbCall(item));
})
container2.foreach((item)=>{
    obj.push(dbCall(item));
})

await Promise.all(obj)

请记住, Array.map返回一个新数组,在这种情况下是一个 Promises 数组,因为 async/await 函数总是返回 Promises。 所以你传递[map1, map2]例子将是一个二维数组; 它将是一组 Promise 数组。 像这样的东西:

[[Promise1, Promise2, Promise3, ...], [Promise4, Promise5, Promise6...]]

Promise.all 函数需要一个 Promises 数组,而不是一个 Promises 数组数组,因此它失败了。 你只需要向它传递正确的数组结构,你可以使用Array.concat (对于 ES5 语法)或扩展运算符(对于 ES6 语法)。

Promise.all(map1.concat(map2));
// OR
Promise.all([...map1, ...map2]);

首先简化您的代码从该数组push

const obj1 = await Promise.all(container1.map(dbCall));
const obj2 = await Promise.all(container2.map(dbCall));

然后,要同时运行它们,在它们周围添加另一个Promise.all

const [obj1, obj2] = await Promise.all([
  Promise.all(container1.map(dbCall)),
  Promise.all(container2.map(dbCall)),
]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM