如果make console.log,socketio array.splice不起作用

时间:2017-04-12 23:47:02

标签: socket.io console.log array-splice

奇怪的现象。 socketio

SERVER

我有那段代码......

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的一切顺利。如果我从其他地方打印商店数组,它显示正确...但在这种情况下

    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 数组仍然包含值(换句话说,splice不起作用)

评论给予,更多和更好的信息。您也可以测试它并查看结果

1 个答案:

答案 0 :(得分:1)

您的嵌入式for循环会覆盖顶级i循环中的for变量。

let所有var循环使用for (let i = 0; ....)代替for,因此每个循环都有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;
        }
    }
});