在forEach循环中调用socket.disconnect实际上并不会在所有套接字上调用disconnect

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上下文,调用堆栈,事件循环.但是我不能把这一切都放在一起.我真的不明白为什么以及如何发生这个问题.有人可以详细解释一下.什么是解决或避免它们的最佳方法.

Use*_*ode 4

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

_socket = _map[ _k ];
socket.disconnect(true);
Run Code Online (Sandbox Code Playgroud)

看来您正在将一个项目 from 分配_map给变量_socket,但然后调用disconnecton socket,这是一个不同的变量。我猜这是一个拼写错误,你是想打电话disconnect_socket吗?

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

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