Как перебрать кучу элементов и выполнить некоторые асинхронные задачи и дождаться их всех?

for (const item of items) {
    Promise.all([item.someAsync1, item.someAsync2]]).then(res => {
        const [res1, res2] = res;
        doSomeSyncStuffWithRes1AndRes2();
    }).catch(err => console.log(err));
}
console.log('finished'); //I want this to print only after everything has finished.

Я пробовал создать массив обещаний и подтолкнуть к нему все, но это тоже не работает, потому что я использую обещание на каждой итерации?

-3
shayy 31 Июл 2017 в 10:59
Подойдет ли метод jquerys, когда?
 – 
83N
31 Июл 2017 в 11:09
Нет, я использую чистый nodejs (приложение expressjs) с поддержкой async await, если это помогает.
 – 
shayy
31 Июл 2017 в 11:11
Эээ, просто поставьте await перед обещанием?
 – 
Bergi
31 Июл 2017 в 12:11
Что такое item.someAsync1? Это функция, которая при вызове возвращает обещание? Или само обещание для уже вызванной функции?
 – 
jfriend00
31 Июл 2017 в 19:17

2 ответа

ОК, думаю, я понял:

const promises = [];
for(const item of items) {
    promises.push(this.handleItem(item)); //handle item is the inside of each iteration
}
return Promise.all(promises);
-2
shayy 31 Июл 2017 в 11:26

Значит, items - это массив объектов, в которых есть обещания?

Вам нужно будет войти в обратный вызов обещания для одного и выполнить еще один обещание.all для всей коллекции элементов, например:

Promise.all(items.map(item => 
   Promise.all([item.1async,item.2async])
   .then(completedAsyncItems => doSomething()))
.then(allCompletedItems => console.log())
-2
Jusmpty 31 Июл 2017 в 11:34