我有一个子进程工作者,它接收一些数据并将结果发送回动态连接的侦听器。
简化代码:
f(0)
直到我发现如果socket.on(“触发器”在不同用户的非常精确的时刻被触发,每个侦听器都会收到相同的消息。
我可以将worker.once更改为worker.on,但它不是修复,因为我必须过滤传入的数据,然后可能找到一种方法来清除动态添加的侦听器。我在这做错了什么?
答案 0 :(得分:2)
最简单的解决方案之一可能是将一些特定于用户的数据(例如远程IP地址和端口或其他一些唯一标识符)传递给工作人员,而不仅仅是将其传递回响应中的父级。这样您就可以将响应与正确的套接字匹配。
这意味着您只有一个message
侦听器(在socket.io connection
处理程序之外添加)。然后,您将根据响应中传递的信息查找套接字,并将任何数据发送回该客户端。例如:
//foobar.js
worker.on('message', function(responseData) {
// assuming worker returns `{id: ..., data: ...}`
var socket = io.sockets.sockets[responseData.id];
if (socket)
socket.emit('response', responseData.data);
});
io.sockets.on('connection', function (socket) {
socket.on('trigger', function (data) {
worker.send({ id: socket.id, data: data });
});
});