对数组进行异步操作时的副作用



我正在学习node.js,现在我问自己:

如何"线程安全"是正常的数组?

的例子:

var myArr = ["Alpha", "Beta", "Gamma", "Delta"];
ee.on('event', function(itemString) {
    //Loop over an Array that could change its length while looping through
    for(var i=0; i<myArr.length; i++) {
        // delete the item out of the array
        if(myArr[i] == itemString)
            myArr.splice(i,1);
    }
});

如果在ee-Object上触发多个事件,是否有机会,for循环将失败,因为索引已经被拼接掉了?

或说不同:是否有一种方法可以确保循环不会跳过或失败,因为任何元素可能被同一事件的另一个回调调用删除?

THX:)

node.js是单线程的,它不中断同步执行。

尽管如此,你在修改数组的同时迭代它的长度,这可能会导致跳过元素。此外,您的事件还没有准备好为同一个数组元素触发两次。

我认为我们已经很好地讨论了线程问题,但是您仍然应该解决循环问题。对于我正在谈论的"跳过"问题的一个例子,试试这个:

var a = [1, 2, 3, 4, 5];
for (var i = 0; i < a.length; i++) {
    console.log(a[i]);
    if (a[i] === 2) {
        a.splice(i, 1);
    }
}
输出:

1
2
4
5

注意数字3在这个循环中从来没有出现过。

修复这种循环的一种常见方法是,在迭代数组时安全地删除数组中的元素:

var a = [1, 2, 3, 4, 5];
for (var i = a.length - 1; i >= 0; i--) {
    console.log(a[i]);
    if (a[i] === 2) {
        a.splice(i, 1);
    }
}
输出:

5
4
3
2
1

最新更新