2017-03-15 5 views
2

이벤트 리스너로부터 가치를 반환하는 방법은 무엇입니까?Node.js : 이벤트 리스너에서 값을 반환하려면 어떻게해야합니까?

const EventEmitter = require("events").EventEmitter; 
emitter = new EventEmitter(); 
emitter.on("sayHello", function(message) { 
    return message + " World"; 
}); 
let helloMessage = emitter.emit("sayHello", "Hello"); 
console.log(helloMessage); // It should output: "Hello World" 

내가 이벤트 값을 수정하고 수정 된 버전을 반환하려면 :

아래의 예를 참조하십시오.

어떻게해야합니까?

+0

@PavelGatnar 감사합니다. 하지만 수정 된 값을 반환해야합니다. –

답변

5

이벤트 처리기의 반환 값은 완전히 무시됩니다. the documentation에서 :

EventEmitter 객체가 이벤트를 방출, 특정 이벤트에 연결된 모든 기능은 기적이라고합니다. 호출 된 리스너가 리턴 한 값은 무시되고 무시됩니다.

그러나 방출되는 대신 오브젝트를하고 콜백 해당 개체의 상태를 수정할 수 있습니다 무엇을 :

const EventEmitter = require("events").EventEmitter; 
const emitter = new EventEmitter(); 
emitter.on("sayHello", function(e) { 
    e.message += " World";    // Modifying the state 
}); 
const e = {message: "Hello"}; 
emitter.emit("sayHello", e); 
console.log(e.message); // "Hello World" 
이 이 은 (또한 EventEmitter의 인스턴스를 생성하여 변경 사항을주의

, 원래의 코드가 시도 EventEmitter 자체에 on을 사용하지만 하나가되지 않습니다.) 당신은 코멘트에 말한


이 요 자신의 단계로 객체를 생성하지 않아도되고 싶습니다.

class MyEventEmitter extends EventEmitter { 
    emitObject(event, obj = {}) { 
     this.emit(event, obj); 
     return obj; 
    } 
} 

사용법 : 내가 거기에 두 번째 인수에 대한 객체를 제공 한

const emitter = new MyEventEmitter(); 
emitter.on("sayHello", function(e) { 
    e.message += " World"; 
}); 
const evt = emitter.emitObject("sayHello", {message: "Hello"}); 
console.log(evt.message); // "Hello World" 

는 (그래서 우리가 할 수있는 "Hello" + " World" 당신은 쉽게 자신의 emitObject (또는 무엇이든) 기능을 추가 할 수 EventEmitter을 하위 클래스 당신이 그것을 버리면 빈 객체가 기본값으로 설정됩니다 (ES2015 기본 인수).

전체 예제 :

const EventEmitter = require("events").EventEmitter; 
class MyEventEmitter extends EventEmitter { 
    emitObject(event, obj = {}) { 
     this.emit(event, obj); 
     return obj; 
    } 
} 
const emitter = new MyEventEmitter(); 
emitter.on("sayHello", function(e) { 
    e.message += " World"; 
}); 
const evt = emitter.emitObject("sayHello", {message: "Hello"}); 
console.log(evt.message); // "Hello World" 
+0

안녕하세요. 답변 해주셔서 감사합니다. 하지만 너무 어렵습니다. 왜냐하면 매번 이벤트를 만들고 싶을 때마다 새로운 객체를 만들어야하기 때문입니다. 더 좋은 방법이 있니? –

+0

@HasanBayat : 사소한 일입니다. 그리고 다른 방법은 없습니다. 물론 함수로 마무리 할 수 ​​있습니다. –

+0

Node.js에 대한 후크 API와 같은 WordPress가 있습니까? –