Ответ 1
Вы можете использовать Promise.all
(spec, MDN) для этого: он принимает кучу отдельных promises и возвращает вам одно обещание, которое разрешается, когда все те, которые вы ему дали, разрешены или отклоняются, когда кто-либо из них отклоняется.
Итак, если вы вернете обещание doSomeAsyncStuff
, то:
var promises = [];
for(i=0;i<5;i+){
promises.push(doSomeAsyncStuff());
}
Promise.all(promises)
.then(() => {
for(i=0;i<5;i+){
doSomeStuffOnlyWhenTheAsyncStuffIsFinish();
}
})
.catch((e) => {
// handle errors here
});
Axel Rauschmayer имеет хорошую статью о promises здесь.
Вот пример - живая копия на Babel REPL:
function doSomethingAsync(value) {
return new Promise((resolve) => {
setTimeout(() => {
console.log("Resolving " + value);
resolve(value);
}, Math.floor(Math.random() * 1000));
});
}
function test() {
let i;
let promises = [];
for (i = 0; i < 5; ++i) {
promises.push(doSomethingAsync(i));
}
Promise.all(promises)
.then((results) => {
console.log("All done", results);
})
.catch((e) => {
// Handle errors here
});
}
test();