Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在阵列上异步操作时的副作用_Javascript_Node.js - Fatal编程技术网

Javascript 在阵列上异步操作时的副作用

Javascript 在阵列上异步操作时的副作用,javascript,node.js,Javascript,Node.js,我正在学习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++)

我正在学习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);
    }
});
var myArr=[“α”、“β”、“γ”、“δ”];
ee.on('event',函数(itemString){
//在数组上循环,该数组可以在循环时更改其长度

for(var i=0;i
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);
    }
}
请注意,这个循环从未看到数字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);
    }
}
输出:

1
2
4
5
5
4
3
2
1

请注意,我们是这样看待数组的所有元素的。

Node.js是单线程的,因此您的代码不能被另一个线程中断。但是上面的代码被破坏了,因为您在迭代过程中修改数组的方式有时会导致跳过元素。假设所有元素数组中的元素是不同的。(您可以跳过一个元素,但只有在找到匹配的元素后,这意味着不再有匹配的元素,所以您才不在乎。)您可能想看看定义“分解?”我很确定最坏的情况是跳过元素。@smarx好吧,如果你有10个元素,在第9次迭代中删除一个,那么就找不到第10个元素。如果数组变短,for循环将永远不会到达第10个元素。(条件
i
将在
i
达到值
9
之前失败)我想知道的是,是否有办法确保循环不会跳过或失败,因为任何元素都可能被同一事件的另一个回调调用删除。关于你的回答:我还没有注意到这种行为……向后循环数组与“正常”方法有什么区别?正如我所说,Node.js是单线程的aded,因此没有其他线程可以打断您。至于为什么向后迭代可以解决跳过问题,我鼓励您手动完成,注意
I
的值和数组的内容。