在所有需要处理的情况下,在Pusher中实现侦听器是绑定吗?

时间:2012-07-06 08:55:34

标签: pusher

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

因此,如果一个模块有一些像

这样的代码
env.pusher.connection.bind('connected', function() { 
    env.my_channel.bind('private_message',function(data){ ... }
}

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

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

1 个答案:

答案 0 :(得分:0)

我自己想到了一个解决方案。它包括以下步骤:

  • 保留推送活动词典
  • 每个想要使用pusher事件的模块都应首先搜索字典以查看该事件是否存在,如果不存在,则首先编写创建bind的代码并将其添加到字典< / p>

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

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

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

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
}

很想得到一些反馈(缺点等)