Node.js 在将套接字从阵列中移除之前或之后销毁它

Node.js 在将套接字从阵列中移除之前或之后销毁它,node.js,sockets,Node.js,Sockets,在我的node.js应用程序中,我将客户端套接字集合作为一个数组。当发生通信错误时,我只需调用套接字 我的问题是:我应该在将套接字从阵列中移除之前还是之后销毁它?文档并没有说太多 var clientSockets = [] var destroySocketBefore = function(socket) { socket.destroy() var socketIdx = clientSockets.indexOf(socket) if (socketIdx

在我的
node.js
应用程序中,我将客户端套接字集合作为一个数组。当发生通信错误时,我只需调用套接字

我的问题是:我应该在将套接字从阵列中移除之前还是之后销毁它?文档并没有说太多

var clientSockets = []

var destroySocketBefore = function(socket) {
    socket.destroy()

    var socketIdx = clientSockets.indexOf(socket)

    if (socketIdx > -1) {
        clientSockets.splice(socketIdx, 1)
    }
}    

var destroySocketAfter = function(socket) {        
    var socketIdx = clientSockets.indexOf(socket)

    if (socketIdx > -1) {
        clientSockets.splice(socketIdx, 1)
    }

    socket.destroy()
}
  • destroySocketBefore
    的情况下,如果在搜索之前销毁套接字,我不确定是否会在数组中找到该套接字,因此数组仍有可能在后续逻辑中包含无效套接字

  • destroystocketafter
    的情况下,我不确定对从数组中删除的套接字调用
    destroy
    是否会得到所需的结果。是否有可能在拼接阵列后系统会删除套接字对象,因此有时我会对
    null
    对象调用
    destroy


  • 我进行了测试,似乎这两种方法都有效,因为它们之间没有区别,所以我不确定哪种方法是正确的。

    splice只会从用户定义的阵列中移除插座,并且不会对其关闭产生影响,因此根据您的回答,第二种方法是最佳选择

    任何一种解决方案都是有效的,并且两者实际上是相同的。被破坏的套接字将被删除,无论发生什么情况,因为不存在争用条件或类似的情况(因为节点中的javascript执行都发生在同一个线程上)。

    两者之间没有功能上的区别。调用
    socket.destroy()
    不会影响数组,从数组中删除套接字也不会影响套接字,因此您可以按任意顺序执行。我不确定
    destroy
    调用套接字是否会导致空对象,因此一切都会崩溃。调用
    socket.destroy())
    更改套接字对象的内部状态,但不会使对象消失。它只是对象上的一个方法。Javascript不能像在C/C++中那样手动“释放”对象。因此,
    socket
    对象仍然存在,并且在调用
    .destroy()
    后仍然是一个Javascript对象。这两个操作的顺序并不重要。