无法在for循环中使用setTimeout遍历超时值

时间:2019-10-14 16:46:34

标签: javascript

我需要遍历一系列setTimeout函数,以迭代方式更改函数参数和超时值。

here所述,在打印值时,setTimeout在for循环中执行(显然)很奇怪。您可以使用let或定义另一个函数来解析。

这按预期工作:每秒打印一次

function doSetTimeout(i) {
    setTimeout(function() { console.log(i); }, i * 1000);
}

for (var i = 1; i <= 5; ++i)
    doSetTimeout(i);

这无法按预期工作:每秒,五秒钟,第二秒等依次打印i。而不是0、1、2、3、4,它会在浏览器控制台中记录4、0、2、1、3

times = [1,5,1,5];
function doSetTimeout(i) {
    setTimeout(function() { console.log(i); }, times[i] * 1000);
}

for (var i = 0; i <= 4; ++i)
    doSetTimeout(i);

我已经尝试过使用let和一个匿名函数,但也没有成功。

3 个答案:

答案 0 :(得分:0)

在dosetTimeout方法中放置以下代码:正如我在评论中提到的

//捕获“ i”的当前状态     //通过调用具有当前值的函数

(function(i) {
        setTimeout(function() { console.log(i); }, times[i] * 1000)
})(i);

答案 1 :(得分:0)

我根据您的示例编写了快速解决方案。

var i = 0;
var times = [1,5,1,5];

function wait(milleseconds) {
       return new Promise(resolve => setTimeout(resolve, milleseconds))
}

async function myLoop (times,i) {
    await wait(times[i]*1000);
  i++;
  alert('HI');
  if(i<times.length)
  myLoop(times,i);
}

myLoop(times,i);

答案 2 :(得分:0)

我没有意识到我必须将以前的时间加到总数中才能获得顺序的等待。这有效:

previous = 0;
times = [1000,5000,1000,5000];

function doSetTimeout(i) {
    setTimeout(function() { console.log(i); }, times[i] + previous);
    previous += times[i]
}

for (var i = 0; i <= 3; ++i)
    doSetTimeout(i);