【问题标题】:Socket.io returning multiple times for one eventSocket.io 为一个事件多次返回
【发布时间】:2019-07-10 17:08:11
【问题描述】:

在将其标记为重复之前,我检查了大多数其他帖子和解决方案,但无济于事。如果有人想仔细检查,这里是:

1) Socket.io Multiple returns for a single event 2) Socket.io message event firing multiple times
3)socket.on event gets triggered multiple times

还有很多其他的。

现在开始讨论我的问题!

我的客户端和服务器代码中有一个套接字。一旦我的服务器端套接字发出消息,它就会被客户端套接字接收并打印出消息。通过研究,这可能与事件侦听器有关,但我不知道如何将它应用到我的代码中。仅供参考,单击按钮时会运行以下客户端代码。

这是我的客户端代码的 sn-ps

onButtonClick() {
     socket.emit('message_to_server', 'ping');

     socket.on('reply', (tmp) => {
          console.log(tmp); // in this case, call it 'pong'
          this.doSomethingWithMe(tmp);
     });
}

doSomethingWithMe(msg) {
// do something with the information
}

第一次点击按钮,我收到了

> pong

第二次点击按钮,我收到了

> pong
> pong

它继续呈指数增长。

如果需要,我可以发布我的服务器代码,但我 100% 确信它会正确发出信息。

有人有解决这个问题的想法吗?我无法弄清楚听众是如何参与这种情况的,所以我会很感激任何建议!

编辑:我将我的一些代码更改为以下内容:

import React ...

const socket = socketIOClient('http://localhost:3000')

socket.on('reply', (tmp) => {
     console.log(tmp); // in this case, call it 'pong'
     var inst = new drawMe();
     inst.doSomethingWithMe(tmp);     
});

class drawMe extends Component {
     constructor(props) { this.state = { allData: ''}}

     onButtonClick() {
          ...
     }

     doSomethingWithMe(data) {
          this.setState({ allData: data });
     }

我现在收到一条错误消息,提示您无法在尚未安装的组件上调用 setState。我可能不会为这个问题提出另一个问题,但我会很感激任何关于它的建议。如果模组/任何人想要我关闭,我这样做没有问题。

EDIT2:如果其他人有这个问题,我通过移动代码来实例化套接字和构造函数中的事件来使它工作。

【问题讨论】:

    标签: javascript node.js socket.io


    【解决方案1】:

    每次单击按钮时,您都会再次附加事件处理程序。您在点击处理程序中有socket.on;该方法附加一个新的处理程序——也就是说,每次运行时,它都会将指定的函数添加到事件触发时要运行的函数列表的末尾。所以是的,每次单击按钮时,您都会将该功能添加到列表的末尾,并且每次添加它都会运行一次。 (更准确地说,由于您在那里使用匿名函数,因此每次单击按钮时它都会创建一个新函数,并将其添加到事件处理程序列表中以在事件触发时运行。)

    您应该只附加一次事件处理程序,例如在创建套接字之后,而不是在每次点击时。

    【讨论】:

    • 感谢您的快速回复!所以这确实是有道理的,但要澄清一下:我会在我实例化套接字本身的下面写socket.on('reply', (tmp) => {...}吗(const socket = socketIOClient('localhost')?我是
    • 是的,应该可以正常工作:) 只要您只运行一次socket.on 处理程序附件代码,它就会按您的预期工作。 (我也刚刚注意到您在处理函数定义之后缺少结束 ),所以我很惊讶代码一开始没有崩溃:P)
    • 我现在一定会尝试的。在我当前的实现中,我的服务器发出“pong”消息 x (未知)次数。你认为套接字会读取我所有的服务器发出的信号吗?
    • 附加了一个事件处理程序,以便它在任何时候事件触发时运行。如果服务器触发事件​​ 23 次,则处理函数将运行 23 次,与接收事件的顺序完全相同。
    • 所以是的,它有效!但是,当我调用doSomethingWithMe(data) 时,它超出了范围,因为我的套接字实例完全在我的类之上。我知道这不是最初的问题,但是您有什么想法可以解决这个问题吗?
    猜你喜欢
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 2021-12-31
    • 2019-10-30
    • 1970-01-01
    • 2022-01-12
    • 2013-05-21
    相关资源
    最近更新 更多