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对象。这两个操作的顺序并不重要。