数组asynchronous操作时的副作用

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

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

例:

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上触发了多个Events,那么for循环会失败,因为索引已经被剪接掉了吗?

或者说不同:是否确保循环不会跳过或失败,因为可能由同一事件的另一个callback调用删除的任何元素?

谢谢 :)

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

尽pipe如此,您仍然在修改数组的同时通过可能导致跳过元素的长度进行迭代。 此外,您的事件不准备被触发两次相同的数组元素。

我想我们已经涵盖了线程问题,但是您仍然应该解决这个问题。 对于我所说的“跳过”问题的例子,试试这个:

 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。

一种常见的方法来修复这种types的循环,所以您可以安全地删除数组中的元素,而迭代它是向后:

 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 

请注意,我们以这种方式看到数组的所有元素。