UA RU
logo
Back-end      14/12/2022

«Это огромный пробел у большинства разработчиков»: 6 главных вопросов на собеседовании по Node.js

Владислав Хирса BLOG

Senior Backend Developer | Node.js | NestJS | Express.js | SQL | NoSQL | AWS

Что такое цикл событий, как он работает и почему о нем все всегда спрашивают на собеседованиях? Некоторое время я не мог четко ответить на этот вопрос, а уже потом, когда набрался опыта и сам начал нанимать людей, стало понятно, что это реально большой пробел у большинства JavaScript-разработчиков.

1Что такое Event Loop в Node.js

Event Loop — это цикл, с помощью которого Node.js может выполнять неблокирующие операции I/O — input/output.

И еще очень важно, что Event Loop — это «сердце» большого механизма известной библиотеки libuv. Все, что нужно знать о libuv, я описал в своей статье «Фундамент для JavaScript-разработчика: как ответить, что такое libuv на собеседовании по Node.js» .

Теперь мы рассмотрим, что внутри Event Loop:

Фазы — это то, о чем далеко не все знают или говорят, но знание фаз и есть фундамент для понимания последовательности выполнения кода, написанного на JavaScript.

2Расскажите о фазах

  • Timers: фаза, в которой выполняются коллбэки, запланированы setTimeout()и setInterval().
  • Pending callbacks: выполняет I/O-коллбэки, отложенные до следующей итерации цикла.
  • Idle, prepare: использовать только внутри.
  • Poll: получение новых событий I/O; выполнять коллбэки, связанные с I/O (почти все, за исключением выполняемых в фазе коллбэков close callbacks, запланированных таймерами и setImmediate()); при необходимости node может здесь блокироваться.
  • Курс Full-stack developer від Mate academy.
    Опануйте нову професію завдяки курсу Full-stack developer! Ви отримаєте необхідні навички та допомогу у працевлаштуванні! .
    Отримати знижку на курс
  • Check: здесь вызываются setImmediate() callbacks.
  • Сlose callbacks: закрывает коллбэки, такие как socket/http/eventEmitter/.on(‘close', () =>).

С полной информацией о фазах можно ознакомиться здесь.

3Что такое микро- и макрозадачи

После вопросов «что такое Event Loop» и «что вы знаете о фазах»   спрашивают, знаете ли вы, что такое микрозадачи и макрозадачи, в ответ на этот вопрос у меня тоже есть статья .

А сейчас мы разберем следующее:

  • разницу между setTimeout()i setImmediate();
  • разницу между process.nextTick()и setImmediate();
  • какие трудности можно решить с помощью process.nextTick().

4В чем разница между setTimeout() и setImmediate()

setTimeout() — коллбэк, который мы передаем в таймер, выполняется после определенного пройденного времени, переданного вторым аргументом setTimeout()или при отсутствии указанного времени, по умолчанию через 4 мс.

Курс Java developer від Mate academy.
Вивчайте Java та отримайте можливість працювати майже в будь-якій галузі: її використовують від фінансової сфери до аграрної. Працевлаштування гарантуємо!
Отримати знижку на курс

setImmediate() выполняется после текущей poll-фазы:

const fs = require('fs');

fs.readFile(__filename, () => {
  setTimeout(() => {
    console.log('Timeout');
  }, 0);
  setImmediate(() => {
    console.log('Immediate');
  });
});

Результат:

Immediate
Timeout

Но что важно, зависимость от контекста, в котором находятся функции, влияет на то, чей коллбэк выполнится первым.

Когда мы используем оба таймера в логике, работающей с I/O, как в примере сверху, то setImmediate() будет всегда первым при условии, что передаваемые в них коллбэки будут схожи по логике или идентичны.

setTimeout(() => {
  console.log('timeout');
}, 0);
setImmediate(() => {
  console.log('immediate');
});

В противном случае таймеры будут выполняться непредсказуемо. Ниже результат двух запусков таймеров:

Immediate
Timeout
Timeout
Immediate

5В чем разница между process.nextTick() и setImmediate()

В этой ситуации всегда первым выполняется process.nextTick(), он выполняется при следующем тике (tick) ядра вашего компьютера, а это 100-1000 тиков в секунду — и в этом его опасность.

Если вы написали рекурсивную функцию и там есть process.nextTick(), то текущий цикл Event Loop так может и не завершиться, об этом есть предостережение в официальной документации.

6Какие трудности можно решить с помощью process.nextTick()

Есть такие ситуации, когда нам нужно выполнить нашу функцию с минимальной задержкой только после того, как код будет инициализирован, но еще ни одна I/O-операция еще не будет выполнена, и здесь process.nextTick() поможет нам с легкостью:

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {
  constructor() {
    super();

    process.nextTick(() => {
      this.emit('event');
    });
  }
}

const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
  console.log('an event occurred!');
});

Этот пример кода из официальной документации, и очень простой, но он понятно и кратко показывает нам, какую важную проблему мы можем решить:

Англійська для початківців від Englishdom.
Для тих, хто тільки починає вивчати англійську і хоче вміти використовувати базову лексику і граматику.
Реєстрація на курс
const EventEmitter = require('events');

class MyEmitter extends EventEmitter {
  constructor() {
    super();
    this.emit('event');
  }
}

const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
  console.log('an event occurred!');
});

Если исключить process.nextTick() из нашего примера, то событие event никогда не сработает, потому что вызов произошел еще в конструкторе класса MyEmitter, а регистрация события — позже.

Вывод

Если говорить про опыт, то у меня были кандидаты из других стран, которые на вопрос «что такое Event Loop» отвечали так: «Зачем вы задаете мне такой элементарный вопрос, я человек с опытом 5+ лет, и клиент за такие знания не платит, он платит за фичи».

Конечно, все платят за функционал, только вот интересно, сколько будет потрачено времени и каким будет качество кода, если ты не знаешь, как все работает и какая сила в наших руках.

Знание таких вещей как фазы и работа с ними помогает нам понимать более проблемные места в коде, писать код осмысленно и решать более нетривиальные задачи без «костылей», что влияет на надежность и уверенность в работе нашей системы.

Благодарю вас за внимание и продуктивного кодинга 😉

If you have found a spelling error, please, notify us by selecting that text and pressing Ctrl+Enter.

Психологічний профорієнтаційний тест для IT-фахівців від Hillel IT School.
Пройдіть психологічний профорієнтаційний тест для IT-фахівців щоб дізнатися ваші сильні сторони, вподобання і інтереси і з'ясувати, яка IT-спеціальність вам підходить.
Пройти тест

Этот материал – не редакционный, это – личное мнение его автора. Редакция может не разделять это мнение.

Топ-5 самых популярных блогеров сентября

Всего просмотровВсего просмотров
2956
#1
Всего просмотровВсего просмотров
2956
Recruiter| Talent Acquisition Specialist
Всего просмотровВсего просмотров
305
#2
Всего просмотровВсего просмотров
305
Career Consultant в GoIT
Всего просмотровВсего просмотров
108
#3
Всего просмотровВсего просмотров
108
Software Developer у FullCity Consulting
Всего просмотровВсего просмотров
69
#4
Всего просмотровВсего просмотров
69
Всего просмотровВсего просмотров
55
#5
Всего просмотровВсего просмотров
55
Рейтинг блогеров

Самые обсуждаемые статьи

Топ текстов

Ваша жалоба отправлена модератору

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: