Leí esta implementación de un emisor de eventos en LeetCode y quería hacer algunas preguntas.
release en el retorno del método de subscribe ? ¿Por qué no puedo hacer que sea su propio método?unsubscribe como este y cómo lo usaría si fuera su propio método?subscriptions no está definida en un constructor ?Gracias.
class EventEmitter { subscriptions = new Map() subscribe(eventName, callback) { if (!this.subscriptions.has(eventName)) { this.subscriptions.set(eventName, new Set()) } const newSub = { callback } this.subscriptions.get(eventName).add(newSub) return { unsubscribe: () => { const evSub = this.subscriptions.get(eventName) evSub.delete(newSub) if (evSub.size === 0) this.subscriptions.delete(eventName) } } } emit(eventName, ...args) { const callbacks = this.subscriptions.get(eventName) if (!callbacks) return for (let c of callbacks) { c.callback(...args) } } } Respuesta 1: En caso de que la cancelación de la suscripción necesite información que solo esté disponible al realizar la suscripción (como un eventName de suscripción), tiene sentido proporcionar la función directamente desde la creación. Le ahorra tener que almacenar los datos necesarios en el proceso de cancelación de suscripción en algún formulario intermediario. Puede crear su propio método si lo desea, pero aún debe devolverlo como en este código:
unsubscribe(eventName) => { const evSub = this.subscriptions.get(eventName) evSub.delete(newSub) if (evSub.size === 0) this.subscriptions.delete(eventName) } subscribe(eventName, callback) { if (!this.subscriptions.has(eventName)) { this.subscriptions.set(eventName, new Set()) } const newSub = { callback } this.subscriptions.get(eventName).add(newSub) return () => unsubscribe(eventName); } Respuesta 2: almacena el valor de retorno de subscribe en algún lugar al que pueda acceder, luego invóquelo si es necesario llamando a unsubscribe() . La forma en que se usa no es diferente, ya sea en su propia función o no. Todavía necesita saber el eventName , por lo que necesita el devuelto por subscribe . Como en este código:
const unsub = subscribe("event1", () => {}); // then later unsub(); // unsubscribe from event1Respuesta 3: No tiene nada de malo. Es una elección de diseño.
Respuesta 4: Esa es una elección personal.
Respuesta 5: Supongo que está preguntando sobre la variable de subscriptions (plural) y no sobre la función de subscription . Se define como una variable de clase que no necesita ninguna inicialización específica para un parámetro ctor, por lo que no es necesario crear una. Podría ponerlo en un ctor si quisiera, pero solo hace que el código sea más largo sin ningún beneficio real. Si el ctor tomara algunos parámetros que afectarían el valor inicial de subscriptions , entonces podría hacerse en el ctor.