EventEmittersとハンドラーに関してCoffeeScript/NodeJSで非常に奇妙な動作が見られます。問題を示す小さなサンプルをまとめました...
基本的に、イベント処理に間接参照がありますが、最初のイベントハンドラーをラムダでラップしない限り、イベントを機能させることができないようです。この機能を実現するために何かできることがあるかどうかを理解したいと思います。 。基本的test1()に、以下は、私の考え方では、と同じ動作をする必要がありtest3()ます。test2()イベント処理の第2レベルが機能することを示すためだけに含まれています!
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