链接Promises时的外部变量访问

时间:2018-05-04 20:11:26

标签: promise chaining

我在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;
&#13;
&#13;

正如您所看到的,每次内部函数触发时,它总是读取j的值90,而不是读取所有正确的值。

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

var更改为let,然后每次循环调用都有自己的一组变量。

&#13;
&#13;
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;
&#13;
&#13;

let是块作用域,因此每个块(在这种情况下,for循环的每次迭代)都会获得自己的ij变量版本。因此,当您执行alert(j)时,它将使用正确的变量。

仅供参考,我将alert(j)更改为console.log(j),因为使用alert()会导致异步时序混乱(因为它会阻止JS执行),而console.log()只会报告并让代码保持不变通过运行,您可以更好地了解console.log()实际运行的内容。