【问题标题】:duplicates in socket.io w/ angular带有角度的socket.io中的重复项
【发布时间】:2014-12-11 02:57:27
【问题描述】:

使用 angular 和 socket.io 每次服务器发出时,我都会在客户端上收到重复的事件。 Angular 只包含一次,只有一个 socket.io 连接,客户端上每个事件只有一个监听器。在服务器上接收到事件后,会记录数据,并且此过程只发生一次。然后发出数据并在客户端调用回调两次,尽管只在范围内一次(据我所知)。

client:
//inside a controller
var thing ='foo';
socket.emit('sentUp',thing)

socket.on('sentDown',function(thing){
    console.log(thing)//this happens twice
});

server:
/*
node&express stuff here
*/
socket.on('connection',function(socket){
    socket.on('sentUp',function(stuff){
        console.log('this happened')//x1
        socket.emit('sendDown',stuff);
    });
})

【问题讨论】:

    标签: javascript node.js angularjs socket.io duplicates


    【解决方案1】:

    很可能您的控制器被多次加载。您可以通过记录轻松检查它。

    从控制器中移出套接字代码,并将它们放在只被调用一次的服务中。

    【讨论】:

    • 你明白了!我的索引控制器为我的页眉加载了一次,为我的页脚加载了一次。
    【解决方案2】:

    我在自己的socket.io 客户端代码中发现,每次客户端重新连接时都会发生一些连接事件。因此,如果连接因任何原因丢失,然后客户端自动重新连接,客户端可能会再次获得连接事件。

    如果您像我一样在'connect' 事件中添加事件处理程序,那么您可能会意外地为同一事件添加多个事件处理程序,因此您会认为您看到的是重复数据。您没有显示您的客户端代码的那部分,所以我不知道您正在这样做,但这是一个困扰我的问题,它是一种自然的做事方式。

    如果您遇到了这种情况,有几种可能的解决方法:

    1. 您可以在connect 事件之外添加事件处理程序。在添加事件处理程序之前,您不必等待连接完成。这样,您只需执行一次。

    2. 在添加您在连接时添加的事件处理程序之前,您可以删除之前在连接时安装的任何事件处理程序,以确保您永远不会得到重复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 2017-08-25
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      相关资源
      最近更新 更多