setTimeout似乎正在立即执行

时间:2017-09-12 18:24:24

标签: javascript recursion settimeout

我正在尝试自学一些JavaScript并同时使用递归。我在下面写的代码我希望打印"吸气"在打印之间延迟5秒到控制台10次。但是,当我在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);

5 个答案:

答案 0 :(得分:2)

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); 方法需要函数ref。这应该有用。

$qd=$('#quoteDisplay')
$gd.fadeOut(complete: =>
    $qd.text(quotes[randomNumber])
    $gd.fadeIn()
)

答案 1 :(得分:1)

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

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

请改为尝试:

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

您可以使用的另一种形式(仅仅是为了传达函数引用的概念)是:

function callMeAfterDelay() {
    console.log(type);
}

setTimeout(callMeAfterDelay, duration);

答案 2 :(得分:1)

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

这会立即执行console.log(type),然后将结果传递给setTimeout。 console.log的结果是undefined,因此当超时发生时没有任何反应。

相反,你想这样做:

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

答案 3 :(得分:0)

我认为这就是你想要的:

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);

答案 4 :(得分:0)

&#13;
&#13;
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);
&#13;
&#13;
&#13;

试试这个。