首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在forEach循环中调用socket.disconnect实际上并不是在所有套接字上调用disconnect

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

Stack Overflow用户
提问于 2015-06-19 03:18:20
回答 2查看 809关注 0票数 18

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

代码语言:javascript
复制
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);
}

这里是在disconnect listener.The removeDisconnectedClient方法中发生的事情:简单地更新db中的条目以指示被移除的客户端。

socket.on('disconnect',function() { removeDisconnectedClient(socket);});

因此,在这种情况下,并没有为所有套接字触发disconnect事件。它只是从数组中随机地触发了几个套接字。虽然我在队友的帮助下用setTimeout(fn,0)解决了这个问题。

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

EN

回答 2

Stack Overflow用户

发布于 2015-06-21 17:10:15

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

代码语言:javascript
复制
_socket = _map[ _k ];
socket.disconnect(true);

您似乎正在将_map中的一项赋值给变量_socket,但是随后在socket上调用了disconnect,这是一个不同的变量。我猜是打字错误,你的意思是在_socket上调用disconnect

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

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

票数 4
EN

Stack Overflow用户

发布于 2015-06-27 09:37:06

在Socket.io 1.0之后,该库不会向您公开已连接套接字的数组。你可以检查一下,io.socket.sockets.length,不等于打开的socket对象。你最好的办法就是广播一个“断开”消息给所有你想要关闭的客户端,然后打开。在客户端“断开”关闭实际的WebSocket。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30923931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档