如何在For循环中使用timeOuts?

时间:2018-11-09 14:02:29

标签: javascript

因此,我正在尝试使用创建循环来做到这一点:

setTimeout(function() {           
    console.log("Hey!");

    setTimeout(function() {           
       console.log("Hey!");

       setTimeout(function() {           
       console.log("Hey!");

       }, 1000);

    }, 1000);

 }, 1000);

所以,我这样尝试了。

for (i = 0; 1 < 3; i++){
    setTimeout(function() {           
    console.log("Hey!");
}, 1000);
}

但是,它不起作用。

做一些研究,我注意到这是因为每个循环的timeouts相互增加。我该如何解决?

3 个答案:

答案 0 :(得分:1)

您必须递归调用超时,因此编写一个函数,该函数接受当前尝试次数的参数。让它执行操作,然后使用trys参数+ = 1调用自身。

您应该传递多次尝试作为保护措施,以便您可以告诉函数 not 如果尝试次数大于一定限制,则可以自行调用,以避免无限循环。

类似的东西:

timedLog(attempts) {
  console.log('Hey!');
  if (attempts > 10) {
    return;
  } else {
    setTimeout(function() { timedLog(attempts + 1); }, 1000);
  }
}

它看起来不再像是for循环,但这是相同的原理。

答案 1 :(得分:0)

如果每个函数的输出相同,并且您希望以相同的间隔打印它,则可以使用setInterval

function myInterval() {
  return setInterval(function(){
    console.log("Hey!");
  }, 1000);
};

var id = myInterval();

它会永远重复,因此,在这种情况下,您必须在3000毫秒后停止它。

setTimeout(function(){
   clearInterval(id);
}, 3000);

答案 2 :(得分:0)

只需使用循环,每次都增加超时间隔:

for (let i = 0; 1 < 3; i++){
    setTimeout(function() {           
        console.log("Hey!");
    }, i*1000);
}

(请注意,如果您的回调函数依赖于i,则在var循环头中使用let而不是for时,此功能将无法正常工作。原因是与闭包有关-SO上对此有很多疑问,但它与let完美配合-如果由于某种原因您不能使用let,还有其他足够简单的修复程序)