Javascript承诺For循环中的变量范围

时间:2018-03-14 17:03:21

标签: javascript for-loop es6-promise

新手警报!

我试图理解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

或者实际发生的任何执行顺序。

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));
}