2017-05-12 3 views
0

Ich möchte für ein Objekt B die Ereignisse abonnieren, als ein Objekt A ausstrahlt - aber ich möchte das Objekt B selbst nicht an A weitergeben, wegen des Potenzials für einen anderen Entwickler (oder mich selbst in der Zukunft)) das Vorhandensein von B in A zu missbrauchen und so die beiden Gegenstände fest zu koppeln. Gibt es eine Möglichkeit, dass ich nur den Ereignis-Emitter-Aspekt von B an A weitergeben kann, so dass A Ereignisse von (d. H. Gelesen) B empfangen, aber nicht manipulieren (d. H. Schreiben) kann?Wie teile ich * nur * die Ereignisse eines Objekts in node.js?

Eine etwas einfache Lösung, die ich denken kann, wäre eine neue EventEmitter C zu erstellen, dann C mit Handler zu allen Veranstaltungen von B, abonnieren, die die gleichen Ereignisse emittieren, und dann C bis A. passieren

Ist gibt es eine einfachere Lösung?

Antwort

0

Die übliche Bezeichnung für das, was Sie verlangen, ist ein Proxy.

Sie erstellen ein neues Objekt. Geben Sie nur die Methoden an, die Sie bereitstellen möchten. In einem privaten Abschluss haben Sie das tatsächliche EventEmitter-Objekt, und die wenigen Methoden, die Sie anzeigen möchten, können nur auf dem tatsächlichen eventEmitter-Objekt ausgeführt werden, aber niemand mit Zugriff auf den Proxy kann das tatsächliche eventEmitter-Objekt ändern oder Methoden auf dem Emitter verwenden Sie haben dies nicht ausdrücklich im Proxy angegeben. Hier ist ein einfaches Beispiel, das einfach die .on() Methode über den Proxy verwendet (keine anderen Methoden auf dem Emitter kann aufgerufen werden).

Dann, in Ihrem Code, erstellen Sie den Proxy und übergeben Sie den tatsächlichen eventEmitter. Sie können dann das Proxy-Objekt für beliebige Personen freigeben. Sie können nach Ereignissen auf sie hören, aber sie können nichts anderes für den Sender selbst tun.

let proxy = new EmitterProxy(actualEmitter); 

Dann Proxy anderen Code übergeben, wo es nur Zugriff auf die eine Methode aufweist.

// other code can do this 
proxy.on('finish',() => { /* do something here */ }); 
Verwandte Themen