我在JS中遇到了一个大问题。
我有一个功能,我做了一个承诺链。承诺是"添加"到for循环中的最后一个承诺。在这个循环中有一些变量。每个then
的每个函数都需要访问这些变量,即它们的值对应于正确的迭代。
问题是,我相信,因为当函数结束时执行promise,每个promise将读取这些变量的相同值(具有迭代的最后一个值)。
我不希望这种情况发生。我该怎么做才能解决它?
我编写了一个模仿我问题的代码:
function test() {
var p = Promise.resolve();
for (var i = 0; i < 10; i++) {
var j = i * 10;
p = p.then(function() {
alert(j);
});
}
p.then(function() {
alert('finished');
})
}
test();
&#13;
正如您所看到的,每次内部函数触发时,它总是读取j的值90,而不是读取所有正确的值。
感谢您的帮助
答案 0 :(得分:0)
将var
更改为let
,然后每次循环调用都有自己的一组变量。
function test() {
let p = Promise.resolve();
for (let i = 0; i < 10; i++) {
let j = i * 10;
p = p.then(function() {
console.log(j);
});
}
p.then(function() {
console.log('finished');
})
}
test();
&#13;
let
是块作用域,因此每个块(在这种情况下,for
循环的每次迭代)都会获得自己的i
和j
变量版本。因此,当您执行alert(j)
时,它将使用正确的变量。
仅供参考,我将alert(j)
更改为console.log(j)
,因为使用alert()
会导致异步时序混乱(因为它会阻止JS执行),而console.log()
只会报告并让代码保持不变通过运行,您可以更好地了解console.log()
实际运行的内容。