我在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
的请求,所以此时我真的很困惑。如果有人可以投入一些亮光并帮助我理解如何解决这个问题,那将会很棒。
答案 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;
});
}
});