我正在学习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