This question already has answers here:
JavaScript closure inside loops – simple practical example
                            
                                (44个回答)
                            
                    
                3年前关闭。
        

    

我有一个alumId列表,我想传递给firebase查询并检索基于id的信息。现在,我遇到了一个for循环未正确循环的错误。

预期结果将是:


在rootRef的外部,0
外部的rootRef,1
在rootref的内部,0
在rootref中,1


实际结果:


在rootRef的外部,0
外部的rootRef,1
在rootref中,1
在rootref内部,2


for (var each = 0; each < alumAroundId.length; each++) {
    console.log("outside of rootRef", each);
    rootRef.child('users').child(alumAroundId[each].key).once('value', function (eventSnap) {
        console.log(each, "inside the rootRef is off");
        var thisUser = eventSnap.val();
        thisUser.distance = alumAroundId[each].distance;
        $scope.allAlumAround.push(thisUser);
    });
}

最佳答案

您应该阅读闭包以及如何使用它们。主要问题是for循环的内容不会在每次迭代中创建新的作用域。因此,当您的for循环结束时,“每个”变量已更改为最后一个。 firebase查询完成后,它将使用此值。您可以通过执行以下关闭操作来解决此问题:

 for (var each = 0; each < alumAroundId.length; each++) {
    console.log("outside of rootRef", each);
    (function(each){
        rootRef.child('users').child(alumAroundId[each].key).once('value', function (eventSnap) {
            console.log(each, "inside the rootRef is off");
            var thisUser = eventSnap.val();
            thisUser.distance = alumAroundId[each].distance;
            $scope.allAlumAround.push(thisUser);
        });
    })(each);
 }

关于javascript - for循环内的查询无法正常运行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39299563/

10-10 05:39