0

我正在尝试使用 pusher 在 javascript 中创建模块化应用程序。不同的模块需要绑定到同一个推送事件,有时该事件嵌套在另一个事件中。此外,这些模块会根据用户触发的 DOM 事件在不同时间加载。

所以,如果一个模块有一些代码,比如

env.pusher.connection.bind('connected', function() { 
    env.my_channel.bind('private_message',function(data){ ... }
}

另一个模块出现并想要收听相同的private_message事件。如果我编写相同的代码会发生什么情况是第一个绑定被覆盖。

我正在寻找的是一种实现某种侦听器的方法,可能带有从通道事件中删除侦听器的选项。

4

1 回答 1

0

我自己想了一个解决办法。它包括以下步骤:

  • 保留推送事件的字典
  • 每个想要使用推送事件的模块都应该首先搜索字典以查看该事件是否存在,如果不存在,则编写第一次创建绑定的代码并将其添加到字典中

  • 当一个模块第一次创建绑定时,它还应该触发一个自定义事件并将推送器在推送器事件完成时发送的数据传递给它

  • 每个想要使用 pusher 事件的模块都应该为触发 pusher 事件时触发的自定义事件添加一个处理程序

如果这看起来很难理解,这是模块中的一些代码,它是我问题中代码的重写(我使用了 jQuery,因为 jQuery 很简洁并且已经实现了自定义事件):

if (typeof(env.pusher_events['my_channel']['private_message']) == 'undefined'){
    env.pusher_events['my_channel']['private_message'] = true;

    // 'pusher-connected' is defined in another module
    // this module depends on that event but for brevity
    // I'm not defining the 'connected' event here

    $(document).on('pusher-connected', 'body', function(){
        env.my_channel.bind('private_message', function(data){
            $('body').trigger('pusher-my_channel-private_message', data);
        })
    })
}

$(document).on('pusher-my_channel-private_message', 'body', function(data){
    // do something useful with the data
}

希望得到一些反馈(缺点等)

于 2012-07-06T11:31:17.813 回答