Последовательность вывода при выполнении асинхронного кода

Для обычного CommonJS-скрипта сначала выводятся 1, 3, 5, затем 8, undefined и 7. После этого выполняются таймер и callback чтения; их взаимный порядок не следует фиксировать.

Короткий ответ

Что ответить на собеседовании

Для обычного CommonJS-скрипта сначала выводятся 1, 3, 5, затем 8, undefined и 7. После этого выполняются таймер и callback чтения; их взаимный порядок не следует фиксировать.

Подробный разбор

Ответ с пояснениями

Условие

В каком порядке будут напечатаны числа при запуске следующего фрагмента кода?

const { readFile } = require('fs');

readFile('./async.txt', 'utf-8', console.log); // 0

Promise.resolve(console.log(1)).then(console.log);

Promise.resolve(2).then(console.log(3));

setTimeout(() => console.log(4), 0);

console.log(5);

Promise.resolve(6).then(() => console.log(7));

process.nextTick(() => { console.log(8) });

Ответ

Для обычного CommonJS-скрипта сначала выводятся 1, 3, 5, затем 8, undefined и 7. После этого выполняются таймер и callback чтения; их взаимный порядок не следует фиксировать.

console.log(1) и console.log(3) вызываются сразу при вычислении аргументов. Первый возвращает undefined, поэтому последующий then(console.log) печатает undefined. Во втором then передана не функция, а результат console.log(3): новый вывод 2 не возникает.

После синхронного кода очередь nextTick даёт 8, затем promise callbacks — undefined и 7. Таймер выводит 4. Callback readFile получает ошибку и данные, а не число 0: комментарий // 0 не является выводом. Содержимое файла и ошибка чтения в условии не заданы.

Источник: nodejs.org.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее