setTimeout没有等待指定的时间

时间:2016-03-29 18:31:53

标签: javascript

我的setTimeout语句立即进行函数调用,而不是等待我指定的时间,我不知道为什么。 for循环应该花费10秒,然后110秒将布尔值从T更改为F.

    for(var c = 0; c < 10; c++)
    {
        setTimeout(function()
        {
        gold = gold + clickerPower;
        $("#totalGold").html("Gold: " + gold);
        console.log("Clicked!");
        }, 1000);

    }
    setTimeout(function(){frenzyActive = false;}, 110000);

3 个答案:

答案 0 :(得分:1)

启动超时是异步操作。 setTimeout接受函数作为它的第一个参数,因为它正在注册该调用函数以便稍后调用。 JavaScript事件循环的每次迭代都会检查是否已经过了适当的时间,如果是,那么它将触发已注册的回调。与此同时,它还在等待时运行其他代码。

你的for循环不是在等待任何事情。它迭代到10超快速,你所做的只是注册十个回调,在一秒钟内同时触发所有时间(顺便指定时间以毫秒为单位,因此1000 = 1秒)。

您需要setInterval

var count = 0;
var intervalId = setInterval(function () {
  gold = gold + clickerPower;
  $('#totalGold').html('Gold: ' + gold);
  console.log('Clicked!');
  count++;
  if (count === 10) {
    clearInterval(intervalId);
    frenzyActive = false;
  }
}, 1000);

该函数每秒运行一次,每次递增一个count变量。当它达到10时,我们会调用clearInterval,然后从intervalId返回setInterval。这将阻止间隔继续。

当我对异步回调感到困惑时,我回过头来看了这篇文章:)

http://codetunnel.io/what-are-callbacks-and-promises/

我希望有帮助:)

祝你好运!

答案 1 :(得分:0)

执行循环不需要10秒。 Look将立即执行,匿名函数将enqueued 10次,在1秒后执行。

最后一次调用setTimeout将导致匿名函数在110秒后执行。

确保循环中的匿名函数按顺序调用10次,每次间隔1秒后,执行以下操作:

var c = 0;
setTimeout(function() {
    if(c < 10) {
        gold = gold + clickPower;
        console.log("Clicked");
        c++;
        setTimeout(arguments.callee, 1000);
        //^^ Schedule yourself to be called after 1 second
    }
}, 1000);

答案 2 :(得分:0)

我今天确实遇到过这个挑战,@ Guarav Vaish提供的答案让我走上了成功的道路。就我而言,我使用的是ES6语法,值得注意的是arguments.callee已被弃用。但是,这就是我如何编写由Vaish贡献的相同解决方案:

&#13;
&#13;
var c = 0;
setTimeout(function named() {
    if(c < 10) {
        gold = gold + clickPower;
        console.log("Clicked");
        c++;
        setTimeout( ()=>{ named() }, 1000);
        //^^ Schedule yourself to be called after 1 second
    }
}, 1000);
&#13;
&#13;
&#13;

注意:我只是使用命名函数代替原始解决方案中的匿名函数。谢谢。这真的很有帮助