Порядок сообщений: 1, 5, 3, 2, 4. Executor Promise синхронный, а then выполняется до очереди таймеров.
Определение последовательности вывода в консоль при работе с Promise и setTimeout
Порядок сообщений: 1, 5, 3, 2, 4. Executor Promise синхронный, а then выполняется до очереди таймеров.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Укажите порядок появления сообщений в консоли при выполнении следующего JavaScript‑кода:
function demo() {
const promiseObj = new Promise((resolve) => {
console.warn('1');
setTimeout(() => console.warn('2'));
resolve('');
});
promiseObj.then(() => {
console.warn('3');
setTimeout(() => console.warn('4'));
});
console.warn('5');
}
demo();
Ответ
Порядок сообщений: 1, 5, 3, 2, 4. Executor Promise синхронный, а then выполняется до очереди таймеров.
При вызове demo конструктор сразу печатает 1 и регистрирует таймер 2. После присоединения then синхронно печатается 5.
Микрозадача then выводит 3 и только тогда создаёт таймер 4. Таймер 2 был зарегистрирован раньше, поэтому с одинаковой задержкой выполняется первым. console.warn вместо console.log не меняет порядок исполнения JavaScript, хотя интерфейс консоли может отдельно оформлять предупреждения.