Socket.io处理同步接收

时间:2016-05-30 22:41:51

标签: javascript node.js socket.io

出于某种原因,socket.io在这方面是如此痛苦。我已经遇到这个问题大约一个小时了,他们在网上的信息不多,因为JavaScript是同步的,很难找到关于这个事件的信息。

所以基本上我在socket.io中接收了与其他程序员一样的断开连接,如下:

dtype=str

现在,这是问题所在。用户断开连接并且工作正常,除非当然多个用户在彼此之后断开连接。我使用了调试消息,这就是正在发生的事情。

场景:我们有两个用户同时离开。当用户离开时,它在服务器上运行5个不同的功能。

USER1离开:

功能1.
功能2.
功能3.
USER2 LEAVES:
功能1.
功能2.
功能3.
功能4.
功能5.
用户2已成功完全离开了 功能4.
功能5.
用户1已成功完全离开

问题:出于某种原因,当用户1被删除时,它将收到与用户2的断开连接然后开始删除用户2.我正在尝试将其设置为如果用户2在服务器移除时断开连接用户1,它将等到用户1的5个功能完成后再为用户2执行。

编辑:标题显示“正在接收”而不是断开连接,因为它会针对任何事件执行此操作。

2 个答案:

答案 0 :(得分:0)

如果您没有显示相关代码,建议修改代码非常困难,但如果根据您的评论,问题是您的阵列会在您和#39之下从您的下方更改;在迭代它的过程中,然后处理它的典型方法是为了迭代它而制作数组的临时副本。您的副本不会被更改。如果您需要检查套接字是否已从原始阵列中删除,那么您也可以检查它。

以下是这个想法:

// suppose your array of sockets is in socketList

// make a copy of the sockets array
var copyList = socketList.slice(0);
var socket;

for (var i = 0; i < copyList.length; i++) {
    socket = copyList[i];
    // make sure this socket is still in the original array
    if (socketList.indexOf(socket) !== -1) {
        // do your operation here on socket
    }
}

如果您使用对象而不是数组来存储套接字列表,那么您可以使用Object.keys()预取密钥并迭代这些密钥,检查密钥是否仍在在处理它的时候提出对象。

仅供参考,我自己也没有证明这一点,但是.forEach()的MDN文档表明,使用它来迭代数组对于并发修改也是安全的。由于我们没有确切的代码,因此我不确切知道它的行为,所以我可能更愿意使用我自己的副本。

答案 1 :(得分:0)

可能的原因还可能是您拥有同步运行的异步代码。这意味着您必须在调用任何其他处理程序之前上下调用堆栈。您可以强制堆栈展开然后继续使用process.nextTick,但应该知道性能后果,因为我认为在一个周期内可以发生多少次回调,而其余的将排队。

var callback = function (err, data) {
   // will now be next on the stack
   process.nextTick(function() {
        // will be on a clean(ish) stack
   });
}
a(callback); // should be async but is sync