Javascript 为FOR循环中的每个迭代添加暂停/间隔

Javascript 为FOR循环中的每个迭代添加暂停/间隔,javascript,for-loop,iteration,settimeout,setinterval,Javascript,For Loop,Iteration,Settimeout,Setinterval,我想写一个for循环,它在每次迭代后每隔一段时间打印数字1到10 我怎样才能做到呢?我尝试了sleep setInterval setTimeout等等,但似乎找不到任何有效的解决方案。如果可能的话,我只想使用纯Javascript来实现这一点 function abc(){ for(i=1;i<=10;i++){ document.write(i+"<br>"); sleep(1000); } } 您可以将循环分解为递归函数,

我想写一个for循环,它在每次迭代后每隔一段时间打印数字1到10

我怎样才能做到呢?我尝试了sleep setInterval setTimeout等等,但似乎找不到任何有效的解决方案。如果可能的话,我只想使用纯Javascript来实现这一点

function abc(){
    for(i=1;i<=10;i++){
        document.write(i+"<br>");
        sleep(1000);
    }
}

您可以将循环分解为递归函数,并使用setTimeout实现暂停

var i = 0;
var limit = 10;

function loop(){
    console.log(i);
    i++;
    if(i < limit)
    {

        setTimeout(loop, 100);
    }
}
loop();
​

您可以将循环分解为递归函数,并使用setTimeout实现暂停

var i = 0;
var limit = 10;

function loop(){
    console.log(i);
    i++;
    if(i < limit)
    {

        setTimeout(loop, 100);
    }
}
loop();
​

为了回答这个问题,要得到一个类似睡眠函数的东西,你可以写一些类似这样的东西作为辅助函数

function sleep(dur) {
 var d = new Date().getTime() + dur;
  while(new Date().getTime() <= d ) {
    //Do nothing
  }

}

console.log(new Date().getTime())
     sleep(1000)

 console.log(new Date().getTime())
但是请注意,睡眠会在这个时候冻结你的浏览器 当你只想周期性地做某事时,你真的不想有这种行为

在这种情况下,window.setInterval就是您想要的

    function abcd(i){
       document.write(i + "<br>")
    }


function repeatedTimeout(func,times,duration) {
    var args = Array.prototype.slice.call(arguments).splice(3);
    var i = 0;
    args.push(i)
    var wrap = function () {
     if(args[args.length - 1] >= times)
       window.clearInterval(wrap)
      else {

         func.apply(this,args)
         args[args.length - 1]++
       }
    }
    window.setInterval(wrap,duration)
}
repeatedTimeout(abcd,10,1000)
在不冻结浏览器的情况下,每1000毫秒调用10次

这是菜单

使现代化 如果真的是for循环,你可以这样做, 不管这对我有什么意义

for (var i = 0; i <= 10 ; i++) {
  window.setTimeout(
    (function (i){ 
      return function() {
        document.write(i + "<br>")
      }
    })(i),i * 1000)
  }
在这种情况下,这是另一个

这将在for循环中调用window.setTimeout和超时的倍数,以i作为超时,
这是可行的,但我建议您使用setInterval,就像您在评论中发布的小提琴中所做的那样来回答问题,要获得类似睡眠函数的功能,您可以编写类似这样的帮助函数

function sleep(dur) {
 var d = new Date().getTime() + dur;
  while(new Date().getTime() <= d ) {
    //Do nothing
  }

}

console.log(new Date().getTime())
     sleep(1000)

 console.log(new Date().getTime())
但是请注意,睡眠会在这个时候冻结你的浏览器 当你只想周期性地做某事时,你真的不想有这种行为

在这种情况下,window.setInterval就是您想要的

    function abcd(i){
       document.write(i + "<br>")
    }


function repeatedTimeout(func,times,duration) {
    var args = Array.prototype.slice.call(arguments).splice(3);
    var i = 0;
    args.push(i)
    var wrap = function () {
     if(args[args.length - 1] >= times)
       window.clearInterval(wrap)
      else {

         func.apply(this,args)
         args[args.length - 1]++
       }
    }
    window.setInterval(wrap,duration)
}
repeatedTimeout(abcd,10,1000)
在不冻结浏览器的情况下,每1000毫秒调用10次

这是菜单

使现代化 如果真的是for循环,你可以这样做, 不管这对我有什么意义

for (var i = 0; i <= 10 ; i++) {
  window.setTimeout(
    (function (i){ 
      return function() {
        document.write(i + "<br>")
      }
    })(i),i * 1000)
  }
在这种情况下,这是另一个

这将在for循环中调用window.setTimeout和超时的倍数,以i作为超时,
这是可行的,但我建议使用setInterval,就像您在评论中发布的小提琴一样

由于浏览器中JavaScript的异步和单线程特性,像sleep这样的构造不是一种好方法

您可以使用setTimeout编写一个通用函数来执行循环,然后传入应该每隔x毫秒运行的函数。至少你会有一个可重用的容器,你可以在其中运行你的代码

function loopn(n, fn, delay)
{
    if (n > 0) {
        fn();
        if (n > 1) {
            setTimeout(function() {
                loopn(n - 1, fn, delay);
            }, delay);
        }
    }
}

loopn(10, function() {
    console.log('hello there');
}, 1000);

由于浏览器中JavaScript的大部分异步和单线程特性,睡眠等构造不是一种好方法

您可以使用setTimeout编写一个通用函数来执行循环,然后传入应该每隔x毫秒运行的函数。至少你会有一个可重用的容器,你可以在其中运行你的代码

function loopn(n, fn, delay)
{
    if (n > 0) {
        fn();
        if (n > 1) {
            setTimeout(function() {
                loopn(n - 1, fn, delay);
            }, delay);
        }
    }
}

loopn(10, function() {
    console.log('hello there');
}, 1000);

所以你想避免使用setInterval?你用setTimeout和setInterval做了什么?我们可以看看你的代码吗?可能重复的setInterval实际上就是你需要的函数,在这里。只要跟踪一个计数器,当你运行它X次时,就可以取消间隔。@Matthew Gilliard:我用这个让它工作。我只是想知道我如何使用FOR loop来实现它,所以你想避免使用setInterval?你使用setTimeout和setInterval做了什么?我们可以看看你的代码吗?可能重复的setInterval实际上就是你需要的函数,在这里。只要跟踪一个计数器,当你运行它X次时,就可以取消间隔。@Matthew Gilliard:我用这个让它工作。我只是想知道我怎样才能在一段时间内使用循环来完成它。。。Thx=,我知道,我加上它是因为他要求一个类似睡眠功能的东西,我编辑答案是为了指出这一点并添加更多的东西,但这花了我一段时间感谢答案和你的努力。我用这个来实现它,我真正感兴趣的是用for循环来实现它。我不需要使用睡眠。为什么它必须是for循环?@user1688606一会儿更新了应答循环。。。Thx=,我知道,我加上它是因为他要求一个类似睡眠功能的东西,我编辑答案是为了指出这一点并添加更多的东西,但这花了我一段时间感谢答案和你的努力。我用这个来实现它,我真正感兴趣的是用for循环来实现它。我不需要使用睡眠。为什么它必须是for循环?@user1688606更新了答案