2017-04-04 77 views
0

在我的node.js应用程序中,我将一组客户端套接字作为数组集合在一起。发生通讯错误时,我只需在插座上拨打destroy即可。在将阵列从阵列中移除之前或之后销毁插槽

我的问题是:我应该从数组中删除之前还是之后销毁套接字?文件没有说太多。

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() 
} 
  1. destroySocketBefore的情况下,我不知道如果套接字在阵列中发现,如果我寻找它之前摧毁它,所以该数组还包含无效插座的可能性随后的逻辑。

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

我测试,似乎这两种方法的工作有没有差别,所以我不知道哪种方法是正确的。

+0

这两者之间没有功能差异。该数组不受调用'socket.destroy()'的影响,并且套接字不受从数组中移除的影响,因此您可以按任意顺序执行它们。 – jfriend00

+0

我不确定'销毁'套接字将导致一个空对象,所以一切都会炸毁。 –

+0

调用'socket.destroy()'改变套接字对象的内部状态,但不会使对象消失。这只是对象的一种方法。 Javascript不能像你在C/C++中那样手动“释放”对象。所以,'socket'对象仍然存在,调用'.destroy()'后仍然存在一个Javascript对象。无论您在哪个订单中进行两项操作都无关紧要。 – jfriend00

回答

0

两种解决方案都是有效的,两者实际上是相同的。被破坏的套接字将被删除,因为没有竞争条件或类似的东西(因为节点中的JavaScript执行都发生在同一个线程中)。

0

splice只会从用户定义的数组中移除套接字,并且对它关闭没有任何影响,因此根据您的答案,第二种方法是最佳选择。