链接 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 循环的每次迭代)都有自己的 ij 变量版本。因此,当您执行 alert(j) 时,它将使用正确的变量。

仅供参考,我将 alert(j) 更改为 console.log(j),因为使用 alert() 会扰乱异步计时(因为它会阻止 JS 执行),而 console.log() 只是报告并让代码保持 运行ning 以便您更好地了解 运行 与 console.log().

的实际情况