Проверяет понимание event loop, неблокирующего ввода-вывода и асинхронных механизмов в Node.js, что критично для написания производительного серверного кода.
Node.js построен вокруг идеи неблокирующего ввода-вывода. Основной поток выполняет JavaScript, но вместо ожидания завершения операций (чтение файла, сетевой запрос, обращение к базе) он передаёт их операционной системе или пулу потоков libuv. Пока операция выполняется, event loop продолжает обрабатывать другие задачи.
Event loop проходит несколько фаз по кругу: timers (setTimeout, setInterval), pending callbacks, poll (ожидание I/O), check (setImmediate) и close callbacks. Микрозадачи (Promise.then, queueMicrotask) выполняются между фазами, сразу после текущей операции.
const fs = require('fs');
// Асинхронное чтение файла
fs.readFile('data.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log('Файл прочитан:', data);
});
console.log('Это выполнится раньше колбэка');
// То же самое через Promise и async/await
async function readFile() {
const data = await fs.promises.readFile('data.txt', 'utf8');
console.log(data);
}
readFile();Итог: асинхронная модель Node.js эффективна для I/O-нагруженных приложений, но требует осторожности с блокирующими операциями и правильного выбора между колбэками, Promise и async/await.