2017-05-12 1 views
0

개체 B가 개체 A가 방출하는 것보다 이벤트를 구독하고 싶습니다. 그러나 다른 개발자 (또는 나 자신)의 잠재력 때문에 A 개체 B를 전달하려고하지 않습니다.) A에서 B의 존재를 남용하여 두 항목을 단단히 결합하십시오. A가 B의 이벤트 이미 터 측면만을 A로 전달하여 A가 B에서 이벤트를 수신 할 수 있지만 B를 조작 할 수는없는 방법이 있습니까? 내가 생각할 수있는node.js에있는 객체의 이벤트 만 * 공유 * 할 수 있습니까?

다소 간단한 솔루션은 새로운 EventEmitter C를 만들 B의 모든 이벤트에 C를 가입, 같은 이벤트를 방출 핸들러, 다음

인가 A에 C를 통과하는 것 간단한 해결책이 있습니까?

답변

0

일반적인 용어는 프록시입니다.

새 개체를 만듭니다. 당신이 드러내고 자하는 방법만을 제공하십시오. private closure에서는 실제 eventEmitter 객체가 있고 노출하려는 몇 가지 메소드는 실제 eventEmitter 객체에서만 작동 할 수 있지만 프록시에만 액세스 할 수있는 아무도 실제 eventEmitter 객체를 수정할 수 없으며 이미 터의 모든 메소드를 사용할 수 있습니다. 당신은 명시 적으로 프록시에 노출되지 않았습니다. 다음은 프록시를 통해 .on() 메소드를 사용할 수있는 간단한 예제입니다 (에미 터의 다른 메소드는 호출 할 수 없습니다).

class EmitterProxy { 
    constructor(emitter) { 
     // add method that has access to emitter 
     this.on = function(event, fn) { 
      let self = this; 
      return emitter.on(event, function() { 
       // this makes sure that the value of this is the EmitterProxy 
       // instance and not the emitter instance 
       fn.apply(self, arguments); 
      }); 
     } 

     // define any other methods you want to proxy 
    } 
} 

그런 다음 코드에서 프록시를 생성하고 실제 eventEmitter를 전달합니다. 그런 다음 프록시 객체를 원하는 모든 사람과 공유 할 수 있습니다. 그들은 그것에 대한 사건을들을 수는 있지만 에미 터 자체에 대해서는 아무 것도 할 수 없습니다.

let proxy = new EmitterProxy(actualEmitter); 

그런 다음 하나의 메소드에만 액세스 할 수있는 다른 코드로 프록시를 전달하십시오.

// other code can do this 
proxy.on('finish',() => { /* do something here */ }); 
관련 문제