socketio array.splice 如果 make console.log 不工作
socketio array.splice dont work if make console.log
奇怪的现象。套接字
服务器
我有那个代码...
socket.on('disconnect', function(){
console.log('user disconnected');
for(var i=0; i<stores.length; i++ ){
var c = stores[i];
if(c.socketid == socket.id){
stores.splice(i,1);
break;
}
}
});
.splice 一切顺利。如果我从其他地方打印 stores 数组,它显示正确...但在这种情况下
socket.on('disconnect', function(){
console.log('user disconnected');
for(var i=0; i<stores.length; i++ ){
var c = stores[i];
if(c.socketid == socket.id){
for(var i=0; i<stores.length;i++){
console.log(i+" one"+stores[i].name+"-"+stores[i].id)
}
stores.splice(i,1);
for(var i=0; i<stores.length;i++){
console.log(i+" two"+stores[i].name+"-"+stores[i].id)
}
break;
}
}
});
数组没有丢失它的值,我从我的浏览器访问页面(我已连接),
socket.on('storelogged', function (msg){
var storeInfo = new Object();
storeInfo.name = msg.name;
storeInfo.id = msg.id;
storeInfo.socketid = socket.id;
stores.push(storeInfo);
console.log(msg.name + " has connected with " + msg.id + " id." );
});
因此,商店 已推送。但是当我在 socket.on('disconnect',callback) 的第二种情况下断开连接时,stores 数组仍然包含值(换句话说,拼接不起作用)
评论提供更多更好的信息。你也可以测试一下看看结果
您的嵌入式 for
循环正在覆盖顶级 for
循环中的 i
变量。
对所有 for
循环使用 let
而不是 for (let i = 0; ....)
中的 var
,这样每个循环都有不同的局部范围值 i
和内部循环不会覆盖外部循环或为嵌入式 for
循环使用不同的变量名称或使用 .forEach()
为索引创建新变量。
此外,在您正在迭代的数组上调用 .splice()
之后,您已经从 for
循环中递减当前数组索引,否则您将跳过查看数组,因为 .splice()
将其向下移动到您刚刚删除的索引位置,并且您的 for
循环已经迭代。
例如,您可以像这样更改内部 for
循环的变量名称:
socket.on('disconnect', function () {
console.log('user disconnected');
for (var i = 0; i < stores.length; i++) {
var c = stores[i];
if (c.socketid == socket.id) {
for (var j = 0; j < stores.length; j++) {
console.log(j + " one" + stores[j].name + "-" + stores[j].id)
}
stores.splice(i, 1);
// make sure not to skip the value we just moved into the i slot in the array
i--;
for (var k = 0; i < stores.length; k++) {
console.log(k + " two" + stores[k].name + "-" + stores[k].id)
}
break;
}
}
});
或者,您可以将 let
用于 for
循环:
socket.on('disconnect', function () {
console.log('user disconnected');
for (var i = 0; i < stores.length; i++) {
var c = stores[i];
if (c.socketid == socket.id) {
for (let i = 0; i < stores.length; i++) {
console.log(i + " one" + stores[i].name + "-" + stores[i].id)
}
stores.splice(i, 1);
// make sure not to skip the value we just moved into the i slot in the array
i--;
for (let i = 0; i < stores.length; i++) {
console.log(i + " two" + stores[i].name + "-" + stores[i].id)
}
break;
}
}
});
或者,您可以使用 .forEach()
:
socket.on('disconnect', function () {
console.log('user disconnected');
for (var i = 0; i < stores.length; i++) {
var c = stores[i];
if (c.socketid == socket.id) {
stores.forEach(function(item, index) {
console.log(index + " one" + item.name + "-" + item.id)
});
stores.splice(i, 1);
// make sure not to skip the value we just moved into the i slot in the array
i--;
stores.forEach(function(item, index) {
console.log(index + " one" + item.name + "-" + item.id)
});
break;
}
}
});
奇怪的现象。套接字
服务器
我有那个代码...
socket.on('disconnect', function(){
console.log('user disconnected');
for(var i=0; i<stores.length; i++ ){
var c = stores[i];
if(c.socketid == socket.id){
stores.splice(i,1);
break;
}
}
});
.splice 一切顺利。如果我从其他地方打印 stores 数组,它显示正确...但在这种情况下
socket.on('disconnect', function(){
console.log('user disconnected');
for(var i=0; i<stores.length; i++ ){
var c = stores[i];
if(c.socketid == socket.id){
for(var i=0; i<stores.length;i++){
console.log(i+" one"+stores[i].name+"-"+stores[i].id)
}
stores.splice(i,1);
for(var i=0; i<stores.length;i++){
console.log(i+" two"+stores[i].name+"-"+stores[i].id)
}
break;
}
}
});
数组没有丢失它的值,我从我的浏览器访问页面(我已连接),
socket.on('storelogged', function (msg){
var storeInfo = new Object();
storeInfo.name = msg.name;
storeInfo.id = msg.id;
storeInfo.socketid = socket.id;
stores.push(storeInfo);
console.log(msg.name + " has connected with " + msg.id + " id." );
});
因此,商店 已推送。但是当我在 socket.on('disconnect',callback) 的第二种情况下断开连接时,stores 数组仍然包含值(换句话说,拼接不起作用)
评论提供更多更好的信息。你也可以测试一下看看结果
您的嵌入式 for
循环正在覆盖顶级 for
循环中的 i
变量。
对所有 for
循环使用 let
而不是 for (let i = 0; ....)
中的 var
,这样每个循环都有不同的局部范围值 i
和内部循环不会覆盖外部循环或为嵌入式 for
循环使用不同的变量名称或使用 .forEach()
为索引创建新变量。
此外,在您正在迭代的数组上调用 .splice()
之后,您已经从 for
循环中递减当前数组索引,否则您将跳过查看数组,因为 .splice()
将其向下移动到您刚刚删除的索引位置,并且您的 for
循环已经迭代。
例如,您可以像这样更改内部 for
循环的变量名称:
socket.on('disconnect', function () {
console.log('user disconnected');
for (var i = 0; i < stores.length; i++) {
var c = stores[i];
if (c.socketid == socket.id) {
for (var j = 0; j < stores.length; j++) {
console.log(j + " one" + stores[j].name + "-" + stores[j].id)
}
stores.splice(i, 1);
// make sure not to skip the value we just moved into the i slot in the array
i--;
for (var k = 0; i < stores.length; k++) {
console.log(k + " two" + stores[k].name + "-" + stores[k].id)
}
break;
}
}
});
或者,您可以将 let
用于 for
循环:
socket.on('disconnect', function () {
console.log('user disconnected');
for (var i = 0; i < stores.length; i++) {
var c = stores[i];
if (c.socketid == socket.id) {
for (let i = 0; i < stores.length; i++) {
console.log(i + " one" + stores[i].name + "-" + stores[i].id)
}
stores.splice(i, 1);
// make sure not to skip the value we just moved into the i slot in the array
i--;
for (let i = 0; i < stores.length; i++) {
console.log(i + " two" + stores[i].name + "-" + stores[i].id)
}
break;
}
}
});
或者,您可以使用 .forEach()
:
socket.on('disconnect', function () {
console.log('user disconnected');
for (var i = 0; i < stores.length; i++) {
var c = stores[i];
if (c.socketid == socket.id) {
stores.forEach(function(item, index) {
console.log(index + " one" + item.name + "-" + item.id)
});
stores.splice(i, 1);
// make sure not to skip the value we just moved into the i slot in the array
i--;
stores.forEach(function(item, index) {
console.log(index + " one" + item.name + "-" + item.id)
});
break;
}
}
});