JS Socket.io断开for()循环

时间:2014-06-29 08:52:53

标签: javascript node.js socket.io

我有这个对象

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

赞赏任何想法

1 个答案:

答案 0 :(得分:1)

似乎问题出现是因为.disconnect()方法从obj数组中删除了一个元素(实际上它从io.sockets.manager.rooms['Room1']数组中删除了一个元素,这反映在obj上)

因此,在第一次迭代中,obj等于['idxx1','idxx2','idxx3','idxx4','idxx5']key等于0idxx1被删除。没关系。

但在第二次迭代中,obj等于['idxx2','idxx3','idxx4','idxx5']key1obj[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();
}