Unten ist ein kurzes Konzept der Art von EventBus, an die ich gedacht habe:
Code: Select all
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)
}
}
}
}
Code: Select all
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)
}
- Gibt es einen idiomatischeren oder empfohlenen Ansatz? Implementieren einer Pub/Sub- oder ereignisbasierten Architektur in einem TypeScript-CLI-Projekt?
- Sehen Sie irgendwelche Fallstricke in diesem simplen Design (wie potenzielle Speicherlecks oder Leistungsprobleme), wenn die CLI groß wird? oder wird häufig ausgeführt?
- Würden Sie Schlagen Sie vor, irgendeine Art von Prioritätsbehandlung oder asynchroner Ereignisverarbeitung für fortgeschrittenere CLI-Aufgaben einzuführen?
- Gibt es bekannte Muster für die Überbrückung von Ereignisemissionen zwischen verschiedenen Modulen (z. B. Nutzungsverfolgung, Fehlerprotokollierung) in a CLI-Kontext, den ich untersuchen sollte?
Ähnliches Problem: https://github.com/supitsdu/climonad.js/issues/23