setTimeout未等待指定时间

setTimeout not waiting specified time

本文关键字:定时间 等待 setTimeout      更新时间:2023-09-26

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

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

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

你的for循环没有在等待任何东西。它以极快的速度迭代到10,您所做的就是在一秒内注册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并给它从setInterval返回的intervalId。这将停止间隔的继续。

看看我在对异步回调感到困惑时写的这篇文章:)

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

我希望这有帮助:)

祝你好运!

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

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

我今天确实遇到了这个挑战,@Guarav Vaish提供的答案让我走上了成功的道路。在我的例子中,我使用的是ES6语法,值得注意的是arguments.callee已被弃用。然而,以下是我如何编写与Vaish提供的解决方案相同的解决方案:

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

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