【问题标题】:delay a for loop with javascript [duplicate]用javascript延迟for循环[重复]
【发布时间】:2014-12-12 11:58:18
【问题描述】:

我想将“for 循环”延迟一段时间,但不知道该怎么做。

例如。假设这个“for 循环”从 0 运行到 8 并且在每个 i 之后应该有 2 sek 的延迟。

for (var i=0; i<8; i++{
  do something...
  wait for 2 sek. and go on with i=i++;
}

【问题讨论】:

  • 您能否详细说明您实际想要实现的目标?您可能会想要使用 setTimeout,但如果不知道您的目标就很难说。
  • 这在 JS 中是不可能的。您必须使用函数并使用setTimeout
  • 我猜这个帖子回答了你的要求stackoverflow.com/questions/3583724/…

标签: javascript for-loop delay


【解决方案1】:

你必须走那条路:

function jsHello(i) {
    if (i < 0) return;

    setTimeout(function () {

        alert("Hello " + i);

        jsHello(--i);

    }, 2000);
}

jsHello(5);

function jsHello(i) {
    alert("Hello " + i);

    if (--i > -1) {
      setTimeout(function () { jsHello(i); }, 2000);
    }
}

jsHello(5);

【讨论】:

    【解决方案2】:

    Javascript 没有等待命令。获得这种行为的方法是使用setTimeout:

    for (var i=0; i<8; i++){
       do_something(i);
    }
    
    function do_something(j) {
      setTimeout(function() {
          tasks to do;
      }, 2000 * j);
    }
    

    每次调用do_something()函数时,它都会以2000*i毫秒为单位执行“待办事项”

    【讨论】:

    • 您的代码中有语法错误,因此您将有一组超时,但在所有超时回调中,我将等于 8
    • 你是对的。我会修改它。
    【解决方案3】:

    要解决此任务,您必须使用闭包 - 在每次迭代时立即调用函数,以 i 作为参数,并在此函数内设置超时。在这种情况下,您传递的参数将存储在范围内,并可用于超时回调:

    for (var i=0; i<8; i++) (function(t) {
      window.setTimeout(function() {
       //do anything with t 
      }, t*2000)
    }(i)) 
    

    UPD

    这里还有一个缩短的 ES6 版本。由于let 具有块作用域,您可以摆脱 os wrap 函数闭包使用

    for (let i=0; i<8; i++){
       setTimeout(() => {
          console.log(i)
      }, 2000 * i);
    }
    

    【讨论】:

    • 虽然可能会增加 N 循环的大量延迟,但这是最简单的方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多