我看到在CoffeeScript中/有關的NodeJS和EventEmitters處理一些很奇怪的行爲。我已經把它表現出的問題,一個小樣本...爲什麼我無法將事件處理程序2委託給深層?
基本上我有我的事件處理一些間接的,但我似乎無法得到它的工作,除非我包的第一個事件處理程序的拉姆達,我想了解爲什麼/如果有什麼我可以做的,以使這項工作。根據我的想法,基本上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
說得好。每當你在JavaScript或CoffeeScript中發現錯誤時,你應該問的第一件事是:「這是什麼」? (或者'@',這是同義詞)。在這種情況下,我會繼續使用胖箭頭'=>'定義'go2'以將其綁定到實例,以便'this'總是意味着您想要的它來。 – 2011-03-31 00:51:11
因爲這是_node_,所以你寧願做'emitter2.go2.bind(emitter2)'而不是重新創建'bindMethod'。 – matyr 2011-03-31 01:13:03
很好的答案,謝謝!在這種情況下使用'=>''胖箭頭''的缺點/怪異行爲是什麼?這看起來正是我在找的東西,不是嗎? – nicolaskruchten 2011-03-31 03:18:48