Написание нескольких картографических функций в Promise.all () - PullRequest
0 голосов
/ 23 января 2020

У меня есть два рабочих блока 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));
}))

Приведенный выше фрагмент блока заполняет дБ, а также локальные контейнеры (obj1, obj2)

Принимая во внимание, что эти две функции карты включены в один Promise.all ([ map1, map2]) не заполняет локальные контейнеры (obj1, obj2) (дБ обновляется, как ожидается)

Как я могу включить две функции карты в один Promise.all ()?

Ответы [ 3 ]

1 голос
/ 23 января 2020

сначала вы пытаетесь объединить два массива, а затем

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

await Promise.all(obj)
1 голос
/ 23 января 2020

Имейте в виду, что Array.map возвращает новый массив , в данном случае это массив Promises, так как функции async / await всегда возвращают Promises. Таким образом, ваш пример передачи [map1, map2] будет двухмерным массивом; это будет массив массивов обещаний. Примерно так:

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

Функция Promise.all ожидает массив Promises, а не массив массивов Promises, следовательно, происходит сбой. Вам просто нужно передать ему правильную структуру массива, которую вы можете сделать с помощью Array.concat (для синтаксиса ES5) или оператора распространения (для синтаксиса ES6).

Promise.all(map1.concat(map2));
// OR
Promise.all([...map1, ...map2]);
0 голосов
/ 23 января 2020

Сначала упростите ваш код из этого массива push ing до

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)),
]);
...