Автор оригинала: FreeCodeCamp Community Member.
Усама Ашраф
Перед началом программирования событий стало популярным, стандартный способ связи между различными частями приложения был довольно простым: компонент, который хотел отправить сообщение другому, явно вызывало метод на этом компонент. Но, управляемый событием код написан на реагировать а не быть называется Отказ
Преимущества событий
Этот подход вызывает наши компоненты быть сильно более отделен Отказ Как мы продолжаем писать приложение, мы определяем события по пути. Мы уволяем их в нужное время и прикрепите одно или несколько Слушатели событий каждому. Расширение функциональности становится намного проще. Мы можем добавить больше слушателей на определенное событие. Мы не поддаваемся существующим слушателям или частью приложения, от которого событие было уволено. О чем мы говорим, – это шаблон наблюдателя.
Проектирование архитектуры, управляемой событиями
Выявление событий довольно важно. Мы не хотим в конечном итоге, чтобы удалить/заменить существующие события из системы. Это может заставить нас удалить/изменять любое количество слушателей, которые были прикреплены к событию. Общий принцип, который я использую, это Подумайте о том, чтобы выработать событие только тогда, когда единица бизнес-логики завершает исполнение.
Так сказать, вы хотите отправить кучу различных электронных писем после регистрации пользователя. Теперь сам процесс регистрации может включать в себя множество сложных шагов и запросов. Но с деловой точки зрения, это один шаг. И каждое из электронных писем, которые будут отправлены, а также индивидуальные шаги. Таким образом, это имеет смысл уволить событие, как только регистрация заканчивается. У нас есть несколько слушателей, прилагаемых к нему, каждая из которых отвечает за отправку одного типа электронной почты.
Асинхронный узел архитектура, управляемая событием, имеет определенные виды объектов, называемых «излучателями». Они выделяют именованные события, которые вызывают функции, называемые «слушателями», которые будут вызваны. Все объекты, которые Emit Events – это случаи Eventemitter класс. Используя его, мы можем создать наши собственные события:
Пример
Давайте использовать встроенный События модуль (который я призываю вас проверить подробно), чтобы получить доступ к Eventemitter
Отказ
Это часть приложения, в котором наш сервер получает HTTP-запрос, сохраняет новый пользователь и испускает событие:
И отдельный модуль, где мы прикрепляем слушатель:
Это хорошая практика в отдельная политика от реализации. В этом случае политика означает, какие слушатели подписываются на какие события. Реализация означает сами слушателей.
Это разделение позволяет слушателю становиться воспламененным тоже. Он может быть прикреплен к другим событиям, которые отправляют одно и то же сообщение (объект пользователя). Также важно отметить, что Когда несколько слушателей прикреплены к одному событию, они будут выполняться синхронно и в порядке их прикрепленного Отказ Следовательно, Обуредлистенер
будет работать после Sendemailonregistration
заканчивает исполнение.
Однако, если вы хотите, чтобы ваши слушатели бегали асинхронно, вы можете просто обернуть свои реализации с помощью Setimmediate
как это:
Держите своих слушателей чистым
Придерживайтесь одного принципа ответственности при написании слушателей. Один слушатель должен сделать только одну вещь и сделать это хорошо. Избегайте, например, написание слишком много условных условий в прослушивании, которое решает, что делать в зависимости от данных (сообщение), которое было передано событием. Было бы гораздо более уместно использовать разные события в этом случае:
Отсоединить слушателей явно при необходимости
В предыдущем примере наши слушатели были полностью независимыми функциями. Но в случаях, когда слушатель связан с объектом (это метод), он должен быть вручную отстранен от событий, которые он подписался. В противном случае объект никогда не будет мусором, собранным с помощью части объекта (слушатель) будет продолжать ссылаться на внешний объект (излучатель). Таким образом, возможность утечки памяти.
Например, если мы создаем приложение чата, и мы хотим ответственности за то, что показать уведомление, когда новое сообщение прибывает в чате, что пользователь подключил к себе, должен лежать в этом объекте пользователя, мы можем сделать это:
Когда пользователь закрывает его/ее вкладка или теряет свое подключение к Интернету некоторое время, естественно, мы могли бы выстрелить обратный вызов на стороне сервера, которая уведомляет других пользователей, что один из них только что ушел в автономном режиме. На данный момент, конечно, это не имеет никакого смысла для DisplayNewMessagenotification
быть вызванным для автономного пользователя. Он будет продолжать вызывать новые сообщения, если мы не удалим его явно. Если мы не помимо ненужного вызова, пользовательский объект также останется в памяти на неопределенный срок. Так что обязательно позвоните DisconnectFromChatroom
В вашем обратном вызове Server-Side выполняется, когда пользователь выходит в автономный режим.
Остерегаться
Свободная муфта в архитектурах, ориентированных на события, также может привести к повышению сложности, если мы не осторожны. Может быть трудно отслеживать зависимости в нашей системе. Наше приложение станет особенно подверженным этой проблеме, если мы начнем испускать события изнутри слушателей. Это может вызвать цепочки неожиданных событий.