链接 Promise 时的外部变量访问
External variable access when chaining Promises
我在 JS 方面遇到了很大的问题。
我有一个功能,可以创建承诺链。承诺是 "added" 到 for 循环中的最后一个承诺。在这个循环中有一些变量。每个 then
的每个函数都需要访问这些变量,即它们对应于正确迭代的值。
问题是,我相信,因为承诺是在函数结束时执行的,所以每个承诺将读取这些变量的相同值(它们具有最后一次迭代的值)。
我不希望这种情况发生。我该如何解决?
我写了一个模拟我的问题的代码:
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();
如您所见,每次 then 中的函数触发时,它总是读取 j 的值 90,而不是读取所有正确的值。
感谢您的帮助
将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();
let
是块范围的,因此每个块(在本例中是 for
循环的每次迭代)都有自己的 i
和 j
变量版本。因此,当您执行 alert(j)
时,它将使用正确的变量。
仅供参考,我将 alert(j)
更改为 console.log(j)
,因为使用 alert()
会扰乱异步计时(因为它会阻止 JS 执行),而 console.log()
只是报告并让代码保持 运行ning 以便您更好地了解 运行 与 console.log()
.
的实际情况
我在 JS 方面遇到了很大的问题。
我有一个功能,可以创建承诺链。承诺是 "added" 到 for 循环中的最后一个承诺。在这个循环中有一些变量。每个 then
的每个函数都需要访问这些变量,即它们对应于正确迭代的值。
问题是,我相信,因为承诺是在函数结束时执行的,所以每个承诺将读取这些变量的相同值(它们具有最后一次迭代的值)。
我不希望这种情况发生。我该如何解决?
我写了一个模拟我的问题的代码:
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();
如您所见,每次 then 中的函数触发时,它总是读取 j 的值 90,而不是读取所有正确的值。
感谢您的帮助
将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();
let
是块范围的,因此每个块(在本例中是 for
循环的每次迭代)都有自己的 i
和 j
变量版本。因此,当您执行 alert(j)
时,它将使用正确的变量。
仅供参考,我将 alert(j)
更改为 console.log(j)
,因为使用 alert()
会扰乱异步计时(因为它会阻止 JS 执行),而 console.log()
只是报告并让代码保持 运行ning 以便您更好地了解 运行 与 console.log()
.