javascript - Socket.io 为一个事件返回多次

标签 javascript node.js socket.io

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

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

还有很多其他的。

现在开始讨论我的问题!

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

这是我的客户端代码片段

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。我可能不会就此问题提出另一个问题,但我将不胜感激任何有关它的建议。如果模组/任何人希望我关闭,我这样做没有问题。

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

最佳答案

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

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

关于javascript - Socket.io 为一个事件返回多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56975534/

相关文章:

python - 如何使用将服务器链接到在暴露的本地主机上运行的 flask 应用程序

node.js - 在 WebStorm 和 SourceTree 中使用 NVM 时 Git Hooks 错误

javascript - Chrome 和 Safari 使用 socket.io 恢复为 xhr-polling 而不是 websockets

javascript - Jstree使用Socket IO延迟加载

javascript - 计算带有广告的图库的图片 ID

javascript - 展开折叠图标更改 Bootstrap CSS

javascript - js 代码在 Rails 中不起作用

javascript - Angular 中的汉堡包图标滑出菜单

javascript - Express.js 接下来类似于使用生成器的功能

node.js - 连接到不同命名空间时的 socketIO 握手行为