Что игра «Виселица» может рассказать нам о 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). Что именно слушает? Он прослушивает наше событие под названием «линия». Таким образом, каждый раз, когда происходит событие строки (например, пользователь угадывает букву), обратный вызов с именем «ввод» помещается в очередь событий для запуска.
Надеюсь, это довольно прямолинейно, поэтому мы можем перейти к сути функции.