Что игра «Виселица» может рассказать нам о Node.js — ЧАСТЬ II

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

const readline = require('readline');
const rl = readline.createInterface({ // Turns on readline module                                             input: process.stdin, // Receives input
output: process.stdout // Sends output
});

СИСТЕМА СОБЫТИЙ УЗЛА

Хотя модуль процесса позволяет получить доступ к запущенным процессам, нам по-прежнему нужен метод для «прослушивания» ввода.

Node.js имеет встроенную Систему событий, которая позволяет нам создавать и прослушивать происходящие события. В этой системе существует стандартный модуль под названием events. Сюда входит объект EventEmitter, который позволяет нам управлять происходящими событиями.

Объект EventEmitter — очень важный класс в Node. Он предоставляет канал для отправки событий и уведомления слушателей. В Node есть много объектов, которые наследуются от EventEmitter, и потоки являются одним из них.

Когда у нас есть экземпляр объекта, который может генерировать события, мы можем добавить прослушиватель для этого события. Слушатели добавляются к объекту EventEmitter с помощью одной из следующих функций:

.addListener(eventName, callback)
.on(eventName, callback)// Same as '.addListener'
.once(eventName, callback)

Мы используем второй вариант в нашем коде:

rl.on("line", (input) => { 
  ...
}

Давайте разберем то, что происходит выше. Ранее мы определили переменную (rl) для приема некотороговвода (рис. 1).

const rl = readline.createInterface({                                            input: process.stdin, 
output: process.stdout 
});

Мы присоединяем слушатель к нашей переменной rl(rl.on) (рис. 2). Что именно слушает? Он прослушивает наше событие под названием «линия». Таким образом, каждый раз, когда происходит событие строки (например, пользователь угадывает букву), обратный вызов с именем «ввод» помещается в очередь событий для запуска.

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