2016-09-16 3 views
1

내 자바 스크립트 코드의 이벤트 모듈 인 EventEmitter3을 사용하고 있습니다. Node.js의 event 모듈과 동일하게 작동합니다. 그러나 나는 그것을 올바르게 사용하기 위해 문제에 직면하고있다.this.on을 사용하여 EventEmitter의 이벤트를들을 수 있습니까? 자바 스크립트에서 클래스의 Eventmitter 올바른 사용법을 찾고

일반적으로 내 코드에서 모듈을 사용하는 경우 EventEmitter의 개체를 만든 다음 object.emit을 사용하여 이벤트를 발생시키고 object.on을 사용하여 이벤트를 수신합니다. 그리고 내가 일반적으로하는 일은 다른 클래스에 object.on을 넣어 완벽하게 작동합니다.

이제 코드를 ES6 클래스로 구성하려고합니다. 따라서 EventEmitter을 내 맞춤 클래스에 확장합니다. ClassA이라고하고, EventEmitter의 하위 클래스라고 가정합니다. 나는이 같은 클래스 정의에 자신의 이벤트를 수신하는 경우 :

import EventEmitter from 'eventemitter3'; 

class ClassA extends EventEmitter { 
    constructor() { 
    ... 
    } 

    method() { 
    this.emit('send'); 
    } 

    this.on('send', function(data) { 
    // Do something with data 
    }); 
} 

을 나는 this.on 라인에 예기치 않은 토큰 오류를 얻고있다. 그러나 클래스 내에서 클래스의 이벤트를 듣는 방법을 모르거나이 클래스를 사용할 수 있습니까? 리스너를 클래스 정의 외부에 두어야합니까?

+0

이벤트 이미 터를 상속하지 않고 주입하는 이유는 무엇입니까? 종종 컴포지션은 상속보다 유연하고 깨끗합니다. – Yoda

+0

@Yoda 당신은 전용 이벤트 이미 터 클래스를 생성하고이 ClassA에서 사용한다는 것을 의미합니까? "ClassA"객체가 여러 개 있다고 가정하고 객체가 자체 이벤트 만 듣기를 원한다면 전용 이벤트 이미 터를 사용하면 다른 객체의 이벤트를 수신 대기하게됩니까? – newguy

답변

1

당신은 생성자 내부의 각 인스턴스에 대해 실행 해야하는 전화를 넣어해야합니다

class ClassA extends EventEmitter { 
    constructor() { 
    super() 
    … 
    this.on('send', data => { 
     // Do something with data 
    }); 
    } 

    method() { 
    this.emit('send'); 
    } 
} 

그렇지 않으면 인스턴스의 작성자가 이벤트를 수신하게, 또는 클래스의 메소드 내에서 UNLISTEN/들어요.

+0

감사합니다.보기 좋고 간결합니다. – newguy