Автобус Event Bus – это один из самых популярных шаблонов для развязки частей вашей системы (компонентов) или чего -либо еще, что не должно быть тесно связано. Если у вас есть крупномасштабное применение с большим количеством компонентов, взаимодействующих друг с другом, вы можете заставить ваши компоненты общаться через посредника и поддерживать свободную связь и разделение принципов.
В этой статье я собираюсь познакомить вас с Внедрение автобуса моего события через Native Node.js EventEmitter класс.
Как это устроено
Точка схема шины событий состоит в том, чтобы компоненты могли выпускать обновления в их состояние или запросить некоторые действия, которые будут предприняты через посредник (шина событий), чтобы они полностью отделены от остальной части системы (другие компоненты), и и и и Из -за этого их можно легко удалить из системы, и другие компоненты могут быть легко добавлены.
Реализация
Моя реализация шаблона шины событий не отправляет просто простые сообщения, у нее есть две концепции: канал и Тема Анкет
Автобус событий может содержать любое количество каналы и каждый канал может содержать любое количество темы .
Вы можете послушать канал и получить уведомление по любой теме по этому каналу или вы можете прослушать определенную тему и быть уведомленными только Когда есть обновления по этой конкретной теме.
На приведенной выше диаграмме TODO Component Попросите автобус событие создать канал: Тодо с темами добавлено , удалено и Обновлено Анкет Когда канал создан, он доступен для трансляции.
В зависимости от того, что происходит внутри TODO Component В какой -то момент компонент попросит автобус мероприятия транслировать на Тодо канал с различными темами.
Компонент ведения журнала хочет уведомить обо всем, что касается Тодо (добавлено, обновлено, удалено), поэтому в этом случае компонент подпишится на Тодо канал напрямую (не нужно подписаться на каждую тему индивидуально).
Компонент x Только хочет знать, когда Тодос удаленный Таким образом, он будет слушать (подписаться на) только на удалено Тема на Тодо канал.
Компонент y подписаться только на Обновлено Тема на Тодо канал.
Мероприятие
Каждый слушатель получает мероприятие с этими свойствами
const event = {
channel:'TODO', // channel name
topic:'removed' // topic name
payload:{ // custom object with your custom payload (data)
anyting:'you want'
}
}
Давайте создадим предыдущую диаграмму в коде:
const { EventBus } = require("estacion")
// or import { EventBus } from 'estacion'
// create the event bus
const bus = new EventBus()
// create the channel
const todoChannel = bus.channel("TODO")
// create topics on the channel (optional)
const todoCreatedTopic = todoChannel.topic("created")
const todoUpdatedTopic = todoChannel.topic("updated")
const todoRemovedTopic = todoChannel.topic("removed")
// create listeners
// logingComponent ( in this case just a simple function)
const loggingComponent = event => {
console.log(event.channel) //channel name: TODO
console.log(event.topic) // topic name: removed OR added or UPDATED
console.log(event.payload) // custom payload (data) from the event
}
const componentX = event => {
console.log(event.channel) // TODO
console.log(event.topic) // removed only !
console.log(event.payload) // custom payload from the event
}
const componentY = event => {
console.log(event.channel) // TODO
console.log(event.topic) // updated only !
console.log(event.payload) // custom payload from the event
}
// Connect listeners to the appropriate channel or topic
// add loggingComponent directly to the channel
todoChannel.addListener(loggingComponent)
// add componentX only to the "removed" topic
todoRemovedTopic.addListener(componentX)
// or get to the topic from the channel
todoChannel.topic("removed").addListener(componentX)
// add componentY only to the "updated" topic
todoUpdatedTopic.addListener(componentY)
// or get to the topic from the channel
todoChannel.topic("updated").addListener(componentY)
// emit when todo is removed
todoRemovedTopic.emit({ id: "3413241" })
// or
todoChannel.topic("removed").emit({ id: "3413241" })
// emit when todo is created
todoCreatedTopic.emit({
id: "3413241",
title: "Buy Milk",
content: "Lorem Ipsum"
})
Вывод
- Вы можете иметь любое количество экземпляров автобусов, каналов и тем.
- Легко создавать и удалять каналы и темы (все слушатели автоматически отписываются, когда канал или тема уничтожаются)
Его можно использовать в браузере через События модуль, который автоматически включен в борьеры, такие как WebPack и Browserify.
Это просто простая, минимальная демонстрация, чтобы вы начали с автобуса. Этот модуль шины событий написан в TypeScript, и в нем есть все, что вам нужно для управления вашими событиями.
Перейти к Репозиторий Для получения дополнительных примеров и подробных объяснений.
Или скачать из npm
Оригинал: “https://dev.to/ivandotv/event-bus-pattern-via-native-eventemmiter-class-72a”