JavaScript表现得很奇怪(可能是由于它的异步性质)

时间:2016-07-29 19:44:52

标签: javascript angularjs

我在JS中有这段代码,如下所述

for (id in ids) {
    if (id needs to be called) {
        console.log(id);  // statement 1
        $http.post('someEndpoint', {id : id}).then(function success(response) {
            console.log(id);  // statement 2
            someDataStructure[id].data = response.data;
        });
    }
}

假设ids = [1, 2, 3],在语句1处,1 2 3将打印在控制台上。在声明2中,打印了3 3 3。这显然不太理想,我正在丢失1 2的数据。另外,我必须补充说端点正在收到1 2 3的请求,所以此时我真的很困惑。如果有人可以投入一些亮光并帮助我理解如何解决这个问题,那将会很棒。

1 个答案:

答案 0 :(得分:2)

closure function中包裹id

for (id in ids) {
    (function(id) {
        if (id needs to be called) {
            console.log(id);  // statement 1
            $http.post('someEndpoint', {id : id}).then(function success(response) {
                console.log(id);  // statement 2
                someDataStructure[id].data = response.data;
            });
        }
    })(id);
}

你也可以简单地使用一个forEach循环,它会自动进行闭包:

ids.forEach(function(id) {
    if (/*id needs to be called*/) {
        console.log(id);  // statement 1
        $http.post('someEndpoint', {id : id}).then(function success(response) {
            console.log(id);  // statement 2
            someDataStructure[id].data = response.data;
        });
    }
});