Nar*_*put 18 javascript sockets node.js
我是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);
}
Run Code Online (Sandbox Code Playgroud)
以下是断开连接侦听器中发生的情况.removeDisconnectedClient方法只是更新数据库中的条目以指示已删除的客户端.
socket.on('disconnect',function(){removeDisconnectedClient(socket);});
因此,在这种情况下,并未针对所有套接字触发disconnect事件.它是从阵列中随机抽出的几个套接字.虽然我能够在队友的帮助下使用setTimeout(fn,0)修复它.
我在网上阅读了它,并且只了解setTimeout通过将代码添加到事件队列末尾来延迟代码的执行.我读了关于javascript上下文,调用堆栈,事件循环.但是我不能把这一切都放在一起.我真的不明白为什么以及如何发生这个问题.有人可以详细解释一下.什么是解决或避免它们的最佳方法.
如果没有更多关于代码其余部分的上下文,很难确定,gracefulShutdown但我很惊讶它完全断开了任何套接字:
_socket = _map[ _k ];
socket.disconnect(true);
Run Code Online (Sandbox Code Playgroud)
看来您正在将一个项目 from 分配_map给变量_socket,但然后调用disconnecton socket,这是一个不同的变量。我猜这是一个拼写错误,你是想打电话disconnect来_socket吗?
某些套接字可能会由于其他原因而断开连接,并且您的循环断开某些但不是所有套接字的外观可能只是巧合。
据我从您发布的代码中可以看出,socket应该是undefined,并且您应该在尝试调用disconnect上的方法时遇到错误undefined。
| 归档时间: |
|
| 查看次数: |
617 次 |
| 最近记录: |