【问题标题】:JavaScript setTimeout in for Loop for Performance Test用于性能测试的 for 循环中的 JavaScript setTimeout
【发布时间】:2016-10-28 20:13:36
【问题描述】:

我正在尝试使用 setTimeout 进行使用 console.time() 和 console.timeEnd() 的性能测试。但是,setTimeout() 不会延迟 for() 循环。

这里是 JS 小提琴:

// Start the timer.
console.time('testFor');

for ( i = 0; i < 5; i++ ) {
  setTimeout( console.log('The number is ' + i), 2000 );
}

// End the timer, get the elapsed time.
console.timeEnd('testFor');

如何让 setTimeout() 在我的脚本中工作,为什么它对我不起作用?

【问题讨论】:

  • 异步101,不会发生。
  • setTimeout 不是 sleep 命令。 setTimeout 基本上是告诉 JavaScript 以后运行函数 2000ms。
  • 另外,您需要将 函数 传递给setTimeout。在您的代码中,setTimeout 什么都不做,因为您立即调用 console.log 并将其返回值传递给 setTimeout

标签: javascript for-loop settimeout


【解决方案1】:

其他人已经为您的问题提出了很好的解决方案 - 我想更仔细地检查您的代码发生了什么。

setTimeout 不会延迟代码的推进(就像 sleep 在其他语言中所做的那样),而是推迟运行另一个代码块。这是一个很难理解的奇怪概念;考虑以下示例:

console.time("Main Program");
console.time("Defered Code");

setTimeout(deferedCode, 1000);

console.timeEnd("Main Program");

function deferedCode() {
    console.timeEnd("Defered Code");
}

如果我们在运行此代码后查看控制台,我们将看到“主程序”几乎立即打印出来,大约一秒钟后打印出“延迟代码”。

我们已经要求 setTimeout 在未来 1000 毫秒的时间运行函数 deferedCode,然后让其余代码运行。

还要注意 deferedCode 被传递给 setTimeout 而没有 ()。我们将函数本身而不是deferedCode 的结果传递给setTimeout,以便setTimeout 可以选择何时运行它。

【讨论】:

    【解决方案2】:

    你可以在没有循环的情况下做到这一点,只需使用递归:

    var i = 0;
    
    var logNumber = function(){
        console.log('The number is ' + i);
        i++;
        if(i < 5){
            setTimeout(logNumber, 2000);
        }
    }
    
    logNumber();
    

    【讨论】:

    • 你不是说setTimeout(logNumber, 2000);吗?
    • 很酷,但是有没有一种方法可以在没有递归的情况下做到这一点?也许有一个外壳?
    • 查看@Andrew D 的回答 :)
    【解决方案3】:

    setTimeout 是异步的。如果要定期调用某段代码,请使用 setInterval 函数。

    我认为这段代码接近你想要做的:

    // Start the timer.
    console.time('testFor');
    
    var i = 0;
    var finish = 5;
    var t = setInterval(function() {
      if (i < finish) {
        console.log('The number is ' + i);
        i++;
      } else {
        clearInterval(t);
        // End the timer, get the elapsed time.
        console.timeEnd('testFor');
      }
    }, 2000);
    

    【讨论】:

    • 啊!作为一个n00b,对我来说太复杂了。将函数分配给变量让我很困惑。
    • 我没有将函数分配给变量。我将 setInterval 函数调用的返回值分配给一个变量。 setInterval 返回一个 ID,我们稍后可以将其传递给 clearInterval 以停止操作。
    • setInterval 函数有两个参数 - 第一个是您希望在每个间隔调用的函数,第二个是您希望每次调用之间的毫秒数。 w3schools.com/jsref/met_win_setinterval.asp
    猜你喜欢
    • 1970-01-01
    • 2015-04-26
    • 2014-03-12
    • 2012-09-29
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 2017-09-19
    • 2013-09-09
    相关资源
    最近更新 更多