Для обычного 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.