gpt4 book ai didi

javascript - 在 forEach 循环中调用 socket.disconnect 实际上并没有在所有套接字上调用 disconnect

转载 作者:IT老高 更新时间:2023-10-28 22:12:35 26 4
gpt4 key购买 nike

我是 javascript 世界的新手。最近我在 nodejs 中开发一个聊天应用程序。所以我有一个叫gracefulshutdown的方法如下。

var gracefulShutdown = function() {
logger.info("Received kill signal, shutting down gracefully.");
server.close();
logger.info('Disconnecting all the socket.io clients');
if (Object.keys(io.sockets.sockets).length == 0) process.exit();
var _map = io.sockets.sockets,
_socket;
for (var _k in _map) {
if (_map.hasOwnProperty(_k)) {
_socket = _map[_k];
_socket.disconnect(true);
}
}
...code here...
setTimeout(function() {
logger.error("Could not close connections in time, shutting down");
process.exit();
}, 10 * 1000);
}

这是断开连接监听器中发生的情况。removeDisconnectedClient 方法只是更新数据库中的一个条目以指示已删除的客户端。

socket.on('断开连接', function() { removeDisconnectedClient(socket);});

所以在这种情况下,并没有为所有套接字触发断开连接事件。它仅从阵列中随机触发几个套接字。虽然我在队友的帮助下使用 setTimeout(fn, 0) 修复了它。

我在网上阅读了有关它的信息,并且仅了解 setTimeout 通过将其添加到事件队列的末尾来延迟代码的执行。我阅读了有关 javascript 上下文、调用堆栈、事件循环的信息。但我无法在这种情况下将所有这些放在一起。我真的不明白为什么以及如何发生此问题。有人可以详细解释一下。解决或避免它们的最佳方法是什么。

最佳答案

如果没有更多关于 gracefulShutdown 中其余代码的上下文,很难确定。但我很惊讶它完全断开了任何套接字:

_socket = _map[ _k ];
socket.disconnect(true);

您似乎正在从 _map 分配一个项目到变量 _socket但随后调用 disconnectsocket ,这是一个不同的变量。我猜这是一个拼写错误,你的意思是调用 disconnect_socket ?

某些套接字可能由于其他原因而断开连接,而您的循环正在断开一些但并非所有套接字的外观可能只是巧合。

据我从您发布的代码中可以看出,socket应该是 undefined并且您应该在尝试调用 disconnect 时遇到错误undefined上的方法.

关于javascript - 在 forEach 循环中调用 socket.disconnect 实际上并没有在所有套接字上调用 disconnect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30923931/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com