emitter1.on "test1", () -> emitter2.go2() #why must I wrap this?
Потому что, если вы просто передадите emitter2.go2
, go2 будет вызываться в контексте корневого объекта (window
в браузере; я не очень хорошо знаю node.js) вместо emitter2
. Функция сама по себе ничего не знает об объекте, которому она принадлежит. На самом деле вы должны передать оба звонка на on
.
Чтобы все выглядело немного лучше, вы можете опустить скобки, если ваше закрытие не принимает никаких параметров. В конечном итоге у вас должно быть что-то похожее на это:
handler = new ExampleHandler()
emitter1 = new ExampleEmitter()
emitter2 = new ExampleEmitter()
emitter1.on "test1", -> emitter2.go2()
emitter2.on "test2", -> handler.handle()
emitter1.go1()
Если вам все еще не нравится внешний вид этого, следующим лучшим вариантом будет использование функции, которая «привязывает» функции к объектам путем создания такого замыкания. Впрочем, это не спасет вас от набора текста, и я думаю, что это выглядит некрасиво и трудно читать:
bindMethod = (obj, funcName) ->
-> obj[funcName].apply(obj, arguments)
...
emitter1.on "test1", bindMethod(emitter2, 'go2')
emitter2.on "test2", bindMethod(handler, 'handle')
Наконец, вы можете использовать жирную стрелку =>
для создания таких связанных методов в объявлении класса, чтобы вы могли передавать их по своему усмотрению. go2: -> ...
станет go2: => ...
и т. Д. В этом контексте, однако, я думаю, что это странное поведение. Я бы придерживался мимолетных замыканий, потому что это делает смысл более ясным.