Время выполнения каждой функции:
Сколько времени будет занимать выполнение каждой функции?
Время выполнения каждой функции:
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Сколько времени будет занимать выполнение каждой функции?
/** Сколько времени будет занимать выполнение каждой функции */
function pause500ms () {
return new Promise(res => setTimeout(res, 500));
}
(async function test1 () {
pause500ms();
pause500ms();
})();
(async function test2 () {
await pause500ms();
await pause500ms();
})();
(async function test3 () {
await Promise.all([pause500ms(), pause500ms()]);
})();
(async function test4 () {
await Promise.all([await pause500ms(), await pause500ms()]);
})();
Ответ
Время выполнения каждой функции:
- test1
(async function test1 () {
pause500ms();
pause500ms();
})();
Здесь обе функции pause500ms() вызываются, но их промисы не ожидаются (await нет). Значит, функция test1 завершится почти мгновенно, не дожидаясь 500 мс. Время выполнения — практически 0 мс.
- test2
(async function test2 () {
await pause500ms();
await pause500ms();
})();
Здесь вызовы идут последовательно: сначала ждём 500 мс первого pause500ms(), затем ещё 500 мс второго. Итого около 1000 мс.
- test3
(async function test3 () {
await Promise.all([pause500ms(), pause500ms()]);
})();
Обе функции запускаются одновременно, и мы ждём, пока обе завершатся. Так как обе по 500 мс, общее время — около 500 мс.
- test4
(async function test4 () {
await Promise.all([await pause500ms(), await pause500ms()]);
})();
Здесь сначала выполняется await pause500ms(), ждём 500 мс, затем второй await pause500ms(), ещё 500 мс. В итоге Promise.all получает уже завершенные значения, и ждёт ничего не нужно. Итого около 1000 мс.
Итог:
- test1: ~0 мс (не ждёт)
- test2: ~1000 мс (последовательно)
- test3: ~500 мс (параллельно)
- test4: ~1000 мс (последовательно из-за двойного await)
Такое поведение связано с тем, что await заставляет ждать завершения промиса, а в test4 await внутри массива заставляет ждать по очереди, а не параллельно.