新手警报!
我试图理解for循环中的promise的变量范围。
请考虑以下代码:
function sleep(ms) {
return new Promise(resolve =>
setTimeout(resolve, ms)
);
}
for (var i =0; i<4; i++){
sleep(1000).then(() => console.log(i));
}
承诺被一次调用4次,然后回复:
4
4
4
4
如何保持对i变量的引用?为了得到
0
1
2
3
或者实际发生的任何执行顺序。
答案 0 :(得分:0)
您可以将i
传递给睡眠功能并解决它。
function sleep(i, ms) {
return new Promise(resolve =>
setTimeout(() => {
return resolve(i);
}, ms);
);
}
for (var i = 0; i < 4; i++){
sleep(i, 1000).then((data) => console.log(data));
}
答案 1 :(得分:0)
你的问题就在于你如何调用你的睡眠功能。您必须在await
标记的功能中使用async
关键字。
这应该是代码的外观:
function sleep(ms) {
return new Promise(resolve =>
setTimeout(resolve, ms)
);
}
async function printSleep(){
for (var i =0; i<4; i++){
await sleep(1000).then(() => console.log(i));
}
}
printSleep();
您缺少的关键部分是您必须使用await
实际让您的代码等待睡眠功能完成。如果不这样做,它将对函数进行排队并继续以同步方式执行函数的其余部分,从而导致在for循环结束后执行then语句。
答案 2 :(得分:0)
正如ASDFGerte所指出的,通过将 var 更改为让,i变量将保留在块中并输出所需的引用。
function sleep(ms) {
return new Promise(resolve =>
setTimeout(resolve, ms)
);
}
for (let i=0; i<4; i++){
sleep(1000).then(() => console.log(i));
}