【问题标题】:setTimeout seems to be executing instantlysetTimeout 似乎立即执行
【发布时间】:2018-02-21 07:34:28
【问题描述】:

我正在尝试自学一些 JavaScript 并同时使用递归。我在下面编写的代码希望将“吸入”打印到控制台 10 次,打印之间有 5 秒的延迟。然而,当我在 Chrome 的开发工具中查看控制台时,所有条目在刷新页面后似乎都会立即打印出来。谁能帮我找到我的实施中的错误?谢谢!

function breathe(type, counter, limit, duration) {
  if(counter <= limit) {
    setTimeout(console.log(type), duration);
    counter++;

    return breathe(type, counter, limit, duration);
  }

  console.log("Finished!");
}

var breathing = breathe("inhale", 1, 10, 5000);

【问题讨论】:

标签: javascript recursion settimeout


【解决方案1】:

setTimeout 方法需要一个函数引用。这应该可以。

function breathe(type, counter, limit, duration) {
  if(counter <= limit) {
    setTimeout(function(){console.log(type)}, duration);
    counter++;

    return breathe(type, counter, limit, duration);
  }

  console.log("Finished!");
}

var breathing = breathe("inhale", 1, 10, 5000);

【讨论】:

    【解决方案2】:

    这是因为您正在立即执行 console 语句(因为您正在通过 () 执行 console.log),而不是传入对 setTimeout 的函数引用:

    setTimeout(console.log(type), duration);
    

    试试这个:

    setTimeout(function() {
        console.log(type)
    }, duration);  
    

    您可以使用的另一种形式(只是为了强调传递函数引用的概念)是这样的:

    function callMeAfterDelay() {
        console.log(type);
    }
    
    setTimeout(callMeAfterDelay, duration);
    

    【讨论】:

      【解决方案3】:
      setTimeout(console.log(type), duration);
      

      这是立即执行console.log(type),然后将结果传递给setTimeout。 console.log 的结果是undefined,所以超时后什么都不会发生。

      相反,您想这样做:

      setTimeout(function () {
          console.log(type);
      }, duration);
      

      【讨论】:

        【解决方案4】:

        我想这就是你想要的:

        function breathe(type, counter, limit, duration) {
          if(counter <= limit) {
            setTimeout(function(){
                console.log(type);
                counter++;
        
                return breathe(type, counter, limit, duration);
            }, duration);
          }
        
          console.log("Finished!");
        }
        
        var breathing = breathe("inhale", 1, 10, 5000);
        

        【讨论】:

        • 堆栈溢出的答案应该不仅仅是工作代码。他们应该解释问题是什么以及解决方案如何解决它。
        【解决方案5】:

        var counter = 0;
        
        var duration = 2000
        
        var text = "Inhale";
        
        var limit = 10;
        
        function print(counter, duration, text, limit) {
          setTimeout(function(){
            console.log(text, counter)
            counter++;
            if (counter < limit) {
              print(counter, duration, text, limit);
            }
          },duration)
        };
        
        print(counter, duration, text, limit);

        试试这个。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-08-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-10
          • 2015-02-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多