Функции высшего порядка, обратные вызовы и циклы событий в Node

Эта статья поможет вам понять различные концепции, лежащие в основе Node.js, и даст вам возможность создавать готовые к работе приложения.

Node.js использует управляемую событиями неблокирующую модель ввода-вывода, что делает его легким и эффективным.

Все мы читали это заявление, но что оно на самом деле означает? Давайте разберемся, как раньше работали традиционные модели серверов.

В традиционной модели сервера для каждого запроса к серверу создается поток для обработки одного и того же запроса. Этот тип реализации мало масштабируется, так как количество множественных запросов, которые может обработать ваш сервер, прямо пропорционально количеству потоков, которые ваша машина может запускать.

В Node процесс состоит из одного основного потока выполнения и множества фоновых потоков (обычно выполняющих операции ввода-вывода). Координация между фоновыми потоками и основным потоком выполняется с помощью очереди. Основной поток извлекает задачи из очереди (ставятся в очередь в порядке их получения) и выполняет их.

Вкратце, некоторые из немногих преимуществ использования Node.js перечислены ниже:

  • Сокращает время разработки.
  • Уменьшает количество необходимых серверов / стоимость сервера.
  • Уменьшает время ответа API / время загрузки страницы.

Но в некоторых случаях вам не следует использовать Node.js. Пример можно найти в статье Uber Engineering.

Прежде чем писать код на Node.js, я хотел бы упомянуть некоторые основные концепции Javascript, которые позволяют Node.js работать так, как он это делает.

1. Функции высшего порядка

Это может быть обычным явлением для любого JS-разработчика, но кому-то, кто плохо знаком с JS, это может показаться странным. В JS вы можете передать функцию в качестве параметра другой функции. Давайте разберемся в этом на простом примере.

Просто введите этот код здесь, в Jsbin и увидите волшебство! В приведенном выше примере функция sayWhat была передана функции speak.

2. C allbacks

В приведенном выше примере мы уже видели callback в использовании. Следующая инструкция останавливает выполнение кода.

alert(`${name} threw a boomerang few years ago`);

После закрытия предупреждения вызывается переданный метод. Это называется обратным вызовом.

3. Цикл событий

Все вызовы функций помещаются в стек вызовов на основе LIFO. Цикл событий постоянно проверяет стек вызовов, чтобы узнать, есть ли какая-либо функция, которую нужно запустить. При этом он добавляет любой найденный вызов функции в стек вызовов и выполняет каждый из них по порядку.

Я рекомендую это объяснительное видео Филипа Робертса

Давайте применим практический подход к пониманию цикла событий. Сначала запустите приведенный ниже код.

Приведенный выше код будет работать, как ожидалось. 3 → 1 → 2 → 4

Результат для минимума setTimeout вызывает функцию, которая передается в качестве параметра после времени, указанного во втором параметре. Поскольку время указано как 0, вы можете подумать, что на выходе будет 3 → 1 → 2 → 4. Но из-за того, как работают циклы событий, на самом деле это 3 → 2 → 4 → 1.

Мы закончили с этой статьей в понимании некоторых основных концепций. В следующей статье мы узнаем, как установить Node.js, и напишем базовый код.