Ниже приведена краткая концепция того типа EventBus, о котором я думал:
Код: Выделить всё
export class EventBus {
private listeners: Record> = {}
/**
* Register an event listener for a specified event.
*/
public on(event: string, listener: (...args: unknown[]) => void): void {
if (!this.listeners[event]) {
this.listeners[event] = []
}
this.listeners[event].push(listener)
}
/**
* Unregister an event listener.
*/
public off(event: string, listener: (...args: unknown[]) => void): void {
if (this.listeners[event]) {
this.listeners[event] = this.listeners[event].filter(l => l !== listener)
}
}
/**
* Emit an event to all registered listeners.
*/
public emit(event: string, ...args: unknown[]): void {
if (this.listeners[event]) {
for (const listener of this.listeners[event]) {
listener(...args)
}
}
}
}
Код: Выделить всё
import { EventBus } from "./EventBus"
const bus = new EventBus()
// Subscribe to an "error" event
bus.on("error", (err: unknown) => {
console.error("[climonad.js] Error:", err)
})
// Emit the error somewhere else in the code
try {
// Some CLI-specific action...
} catch (e) {
bus.emit("error", e)
}
- Существует ли более идиоматический или рекомендуемый подход к реализацию архитектуры pub/sub или архитектуры на основе событий в проекте TypeScript CLI?
- Вы видите какие-либо подводные камни в этом упрощенном дизайне (например, потенциальные утечки памяти или проблемы с производительностью), если CLI становится большим или запускается часто?
- Предлагаете ли вы ввести какую-либо обработку приоритетов или асинхронную обработку событий для более сложных задач CLI?
- Существуют ли известные шаблоны для объединения выбросов событий между различными модулями (например, использование отслеживание, регистрация ошибок) в контексте CLI, на который мне следует обратить внимание?
Соответствующая проблема: https://github.com/supitsdu/climonad.js/issues/23
Подробнее здесь: https://stackoverflow.com/questions/793 ... limonad-js