Обычно порядок такой: setTimeout2, setTimeout1, Promise 1, Promise 3, setTimeout4, Promise 2, setTimeout3, Promise. Promise здесь завершается только после своего таймера.
Взаимодействие setTimeout и Promise при разных задержках
Обычно порядок такой: setTimeout2, setTimeout1, Promise 1, Promise 3, setTimeout4, Promise 2, setTimeout3, Promise. Promise здесь завершается только после своего таймера.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо объяснить, в каком порядке появятся сообщения в консоли, когда одновременно используются функции setTimeout и промисы с различными тайм‑аутами.
(() => {
const myPromise = (delay) => new Promise((res, rej) => {
setTimeout(res, delay);
});
setTimeout(() => console.log("in setTimeout1"), 1000);
myPromise(1000).then(res => console.log("in Promise 1"));
setTimeout(() => console.log("in setTimeout2"), 100);
myPromise(2000).then(res => console.log("in Promise 2"));
setTimeout(() => console.log("in setTimeout3"), 2000);
myPromise(1000).then(res => console.log("in Promise 3"));
setTimeout(() => console.log("in setTimeout4"), 1000);
myPromise(5000).then(res => console.log("in Promise"));
})();
Ответ
Обычно порядок такой: setTimeout2, setTimeout1, Promise 1, Promise 3, setTimeout4, Promise 2, setTimeout3, Promise. Promise здесь завершается только после своего таймера.
На отметке около 100 мс выполняется setTimeout2. Таймеры с задержкой 1000 мс зарегистрированы последовательно: setTimeout1, разрешение Promise 1, разрешение Promise 3, setTimeout4. После каждого разрешения соответствующий then выполняется как микрозадача до следующего таймера.
Аналогично около 2000 мс Promise 2 выводится перед setTimeout3; последний Promise ждёт 5000 мс. Все сроки минимальные и зависят от загрузки окружения. Промис не «обгоняет» таймер, который должен сначала его разрешить.