Node Up and Running / Node В начале... (рабочее название): --- Events

Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

События

rishatsharafiev 01.01.14 в 12:11

0

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

rishatsharafiev 01.01.14 в 12:20

0

Если вы когда либо программировали на JavaScript в браузерах, вы раньше использовали события. Однако, модель событий использованная в браузерах приходит скорее из DOM, чем из самого JavaScript, и большинство концепций в DOM не имеют смысла за его контекстом. Давайте посмотрим в DOM модель событий и сравним с реализацией в Node. DOM имеет запускаемую пользователем событийную модель, основанную на взаимодействии пользователя с набором элементов интерфейса, расположенных в древовидной структуре(HTML, XML, и т.п.)

rishatsharafiev 01.01.14 в 12:28

0

Это значит, что когда пользователь взаимодействует с конкретной частью интерфейса, есть событие и контекст элемента HTML/XML на который нажали или произвели иные действия.Этот контекст имеет родителя и потенциального потомка. Модель включает концепции распространения и перехвата, которые позволяют элементам посмотреть или вверх или вниз по дереву, чтобы получить событие, что было вызвано, контекст(объект) элемента является частью дерева.

rishatsharafiev 01.01.14 в 12:37

0

Для примера, в HTML списке, событие нажатия на li может быть перехвачено слушателем(функцией, которая привязана к событию) на элементе ul, который его родитель.И наоборот, нажатие на ul может распространиться вниз на слушателя li.
Модель Node более проста, потому что JavaScript объекты не имеют такого вида древовидной структуры, как в браузерном JavaScript.

rishatsharafiev 01.01.14 в 12:42

0

EventEmitter(Генератор событий)

rishatsharafiev 01.01.14 в 12:45

0

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

rishatsharafiev 01.01.14 в 12:50

0

EventEmitter имеет подручные методы, основные из них on и emit. Класс поддерживает эти методы для использования другими классами. Метод on создает слушателя на событие, как показано в пример 4-1.

rishatsharafiev 01.01.14 в 12:56

0

Пример 4-1. Слушание события с помощью метода on.

rishatsharafiev 01.01.14 в 12:57

0

Метод on получает два параметра: имя события для подслушивания и функцию(callback) для вызова, когда возбуждается событие. Класс наследующий от EventEmitter ожидается вызванный с новым ключевым словом, потому что является интерфейсом псевдокласса. Давайте посмотрим пример 4-2, чтобы увидеть как мы создаем новый класс как слушателя.

rishatsharafiev 01.01.14 в 13:07

0

Пример 4-2. Создание нового класса поддерживающего события с EventEmitter.

rishatsharafiev 01.01.14 в 13:07

0

Мы начинаем этот пример с подключения модуля util поэтому мы можем использовать наследованный метод. Наследование поддерживает путь добавления методов класса EventEmitter в класс Server, что мы создали. Это значит все новые экземпляры Server могут быть использованы как EventEmitter.

rishatsharafiev 01.01.14 в 13:11

0

Мы тогда добавляем модуль events. Однако, мы хотим простой доступ к определенному классу EventEmitter внутри этого модуля. Заметьте как EventEmitter написан прописными буквами, чтобы показать, что это класс. Мы не используем метод createEventtEmitter, потому что мы не планируем использовать EventEmitter прямо. Мы просто хотим привязать его методы к классу Server, который мы собираемся создать.

rishatsharafiev 01.01.14 в 13:33

0

Один раз мы подключили модуль, который нам нужен, следующий шаг создать наш базовый класс Server. Это предлагает одну простую функцию, которая записывает сообщения, когда сам запускается. В реальных реализациях, мы бы оформили класс Server прототипом с функциями, которые класс мог бы использовать. Для простоты, мы пропустили это. Важный шаг использовать sys.inherits(от себя, переименовали модуль sys теперь называется util), чтобы добавить EventEmitter как суперкласс нашему классу Server.

rishatsharafiev 01.01.14 в 13:52

0

Когда мы хотим использовать класс Server, мы запускаем его с new Server(). Этот экземпляр класса Server будет иметь доступ к методам в суперкласса (EventEmitter), это значит, что мы можем добавить слушателя к нашему экземпляру используя метод on.

rishatsharafiev 01.01.14 в 22:49

0

Прямо сейчас, однако, слушатель события, который мы добавили никогда не будет вызван, потому что событие abc не выстрелит. Мы можем исправить это добавлением кода в в пример 4-3, чтобы возбудить событие.

rishatsharafiev 01.01.14 в 14:06

0

пример 4-3. Возбуждение событий

rishatsharafiev 01.01.14 в 14:06

0

Стреляющий слушатель события такой простой как вызывание метода emit, который экземпляр Server наследовал от EventEmitter. Важно заметить, что эти события зависят от экземпляра. Здесь нет глобальных событий. Когда вы вызываете метод, вы привязываете к нему определенный объект базирующийся на классе EventEmitter. Даже различные экземпляры класса Server не могут раздавать события. S из кода в примере 4-3 не может раздаваться похожим событиям как другому экземпляру события, такой как однажды созданный с помощью var z = new Server();

rishatsharafiev 01.01.14 в 14:14

0

Синтаксис функций обратного вызова.

rishatsharafiev 01.01.14 в 14:14

0

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

rishatsharafiev 01.01.14 в 14:18

0

Когда вызываем emit, в добавление названию события, вы также можете положить произвольный список параметров. Пример 4-4 включает три таких параметра. Здесь могут быть переданы в функцию слушающую событие. Когда вы получаете событие request от http сервера, для примера, вы получаете два параметра: req и res. Когда событие request было возбуждено, те параметры были переданы как второй и третий аргумент в функцию emit

rishatsharafiev 01.01.14 в 14:23

0

Пример 4-4. Передача параметров, когда возбуждаем событие.

rishatsharafiev 01.01.14 в 14:23

0

Это важно, чтобы понять как Node вызывает функции слушающие события, потому что это влияет на ваш стиль программирования. Когда emit() вызывается с аргументами, код в примере 4-5 используется, чтобы вызвать каждую функцию слушающую событие.

rishatsharafiev 01.01.14 в 14:25

0

Пример 4-5. Вызов функции слушающей событие от emit

rishatsharafiev 01.01.14 в 14:26

0

Этот код используется в обоих JavaScript методах для вызова функции из кода. Если emit() передается три или несколько аргументов, метод берет кратчайший путь и использует вызов. Иначе, он использует медленнее применение передачи всех аргументов как массив. Важная вещь для понимания, что Node делает в обоих этих вызовах использование этих аргументов прямо. Это значит, что контекст в котором слушатель события вызван есть контекст EventEmitter.- не их оригинальный контекст. Используя Node REPL, вы можете увидеть что происходит, когда вещи вызваны EventEmitter.

rishatsharafiev 01.01.14 в 14:36

0

Пример 4-6. Изменения в контексте вызываются EventEmitter

rishatsharafiev 01.01.14 в 14:37

0

Образец output сначала устанавливает класс Server. Включает функции для возбуждения события output. Метод outputThis привязывается к событию output как слушатель события. Когда мы возбуждаем событие output от различных областей видимости, мы находимся в области объекта EventEmitter, поэтому значение this, что outputThis открыл принадлежит EventEmitter. Следовательно, this переменная должна быть передана как параметр и присвоенной к переменной, если мы желаем сделать его использование в функции обратного вызова события.

rishatsharafiev 01.01.14 в 14:47

0
Минутку...