На самом деле, использование синтаксиса for await
запускает все обещания сразу.
Небольшой фрагмент кода доказывает это:
const sleep = s => {
return new Promise(resolve => {
setTimeout(resolve, s * 1000);
});
}
const somethingAsync = async t => {
await sleep(t);
return t;
}
(async () => {
const items = [1, 2, 3, 4];
const now = Date.now();
for await (const res of items.map(e => somethingAsync(e))) {
console.log(res);
}
console.log("time: ", (Date.now() - now) / 1000);
})();
стандартный вывод: time: 4.001
Но внутренняя часть l oop не действует как «обратный вызов». Если я переверну массив, все журналы появятся одновременно. Я полагаю, что обещания выполняются сразу, и среда выполнения просто ждет, пока первый из них не разрешит go до следующей итерации.
РЕДАКТИРОВАТЬ: На самом деле, использование for await
является плохой практикой, когда мы его используем с чем-то отличным от асинхронного итератора, лучше всего использовать Promise.all
, согласно @Bergi в своем ответе.