我有这个对象
obj = { 'Users': [ 'idxx1', 'idxx2', 'idxx3', 'idxx4', 'idxx5', 'idxx6' ], 'Room1': [ 'idxx1', 'idxx2', 'idxx3', 'idxx4', 'idxx5' ] }
我可以使用
查看Room1
的内容
console.log(io.sockets.manager.rooms['Room1']);
结果:
[ 'idxx1', 'idxx2', 'idxx3', 'idxx4', 'idxx5' ]
我可以使用for()循环单独获取每个值:
for( var key in obj ) {
console.log(obj[key]);
}
结果:
idxx1
idxx2
idxx3
idxx4
idxx5
但是当我尝试断开插座时:
for( var key in obj ) {
io.sockets.sockets[obj[key]].disconnect();
}
(是的我使用Sockets.io 0.9.16而不是v1 +并使用旧的断开方法)
它会断开每一秒的结果,例如:
idxx1
idxx3
idxx5
赞赏任何想法
答案 0 :(得分:1)
似乎问题出现是因为.disconnect()
方法从obj
数组中删除了一个元素(实际上它从io.sockets.manager.rooms['Room1']
数组中删除了一个元素,这反映在obj
上)
因此,在第一次迭代中,obj
等于['idxx1','idxx2','idxx3','idxx4','idxx5']
,key
等于0
,idxx1
被删除。没关系。
但在第二次迭代中,obj
等于['idxx2','idxx3','idxx4','idxx5']
,key
为1
,obj[1]
等于idxx3
。这就是我认为idxx2
被跳过的原因。同样适用于idxx4
。
我看到以下解决方案 - 使用obj
循环(不是for
)以相反的顺序迭代for-in
:
for (var key = obj.length - 1; key >= 0; key--) {
io.sockets.sockets[obj[key]].disconnect();
}
或者在每个for
次迭代中使用零索引:
for (var i = 0, length = obj.length; i < length; i++) {
io.sockets.sockets[obj[0]].disconnect();
}