我在 CoffeeScript/NodeJS 中看到一些关于 EventEmitters 和处理程序的非常奇怪的行为。我已经整理了一个小样本来展示这个问题......
本质上,我的事件处理有一些间接性,但除非我将第一个事件处理程序包装在 lambda 中,否则我似乎无法让它工作,我想了解为什么/如果有什么我可以做的事情来完成这项工作. test1()
以我的思维方式,基本上下面应该具有与test3()
. test2()
包括在内只是为了表明第二级事件处理有效!
events = require "events"
class ExampleEmitter extends events.EventEmitter
constructor: () ->
go1: () ->
console.log("fire 1")
@emit("test1", "there")
go2: () ->
console.log("fire 2")
@emit("test2", "there")
class ExampleHandler
constructor: () ->
handle: (x) -> console.log("hey", x)
test1 = () ->
handler = new ExampleHandler()
emitter1 = new ExampleEmitter()
emitter2 = new ExampleEmitter()
emitter1.on "test1", emitter2.go2
emitter2.on "test2", handler.handle #this doesn't fire :(
emitter1.go1()
test2 = () ->
handler = new ExampleHandler()
emitter1 = new ExampleEmitter()
emitter2 = new ExampleEmitter()
emitter1.on "test1", emitter2.go2
emitter2.on "test2", handler.handle
emitter2.go2()
test3 = () ->
handler = new ExampleHandler()
emitter1 = new ExampleEmitter()
emitter2 = new ExampleEmitter()
emitter1.on "test1", () -> emitter2.go2() #why must I wrap this?
emitter2.on "test2", handler.handle
emitter1.go1()
console.log "\ntest1"
test1()
console.log "\ntest2"
test2()
console.log "\ntest3"
test3()
这是输出:
test1
fire 1
fire 2
test2
fire 2
hey there
test3
fire 1
fire 2
hey there