【问题标题】:In Node.js, how can I make a parent object emit all of a child object's events?在 Node.js 中,如何让父对象发出所有子对象的事件?
【发布时间】:2012-09-02 02:50:32
【问题描述】:

假设我有一个像这样的对象(使用咖啡脚本):

class Client
  constructor: (socket) ->
    @id     = socket.id
    @socket = socket
    # some other initialization here...

现在,每当@socket 发出某些东西时,我希望客户端对象通过发出相同的事件来模仿它。我想不出比只监视@socket 发出的每个事件并在 Client 类中手动发出它更好的方法,即:

class Client
  constructor: (socket) ->
    # ...
    @socket.on('disconnection', onDisconnect)
    @socket.on('message', onMessage)

  onDisconnect: ->
    this.emit('disconnection')

  onMessage: (data) ->
    this.emit('message', data)

我知道必须有更好的方法,但我不确定如何去做。

【问题讨论】:

  • 检查一下,Matt:github.com/HenrikJoreteg/wildemitter 通配符事件处理...有帮助吗?
  • Jason 很高兴知道这一点,但不幸的是,我认为 socket.io 发出事件时不会这样。

标签: node.js events coffeescript socket.io eventemitter


【解决方案1】:

猴子补丁@socket 对象发射:

class Client
  constructor: (socket) ->
    @reEmit(socket)

  reEmit: (ee)->
    oldEmit = ee.emit
    ee.emit = (args...)=>
      @emit(args)       
      oldEmit.apply(ee, args)

【讨论】:

    【解决方案2】:

    这样的? (未经测试。)

    class Client
    
      constructor: (socket) ->
        # ...
        for event in ['disconnect', 'message']
          @socket.on(event, => @emit(event, arguments))
    

    【讨论】:

    • 我真正想要完成的是不必知道套接字可能从 Client 类中发送什么事件。因此,理想情况下,客户端将转发所有套接字事件,无论它们是什么,即循环中没有明确的事件名称。
    • 嗯,我不认为你可以用标准的 Emitter 东西做到这一点,对不起。
    猜你喜欢
    • 2020-06-06
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 2019-11-20
    • 1970-01-01
    相关资源
    最近更新 更多