簡體   English   中英

setTimeout不等待指定的時間

[英]setTimeout not waiting specified time

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

啟動超時是異步操作。 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並為其提供setInterval返回的intervalId 這將阻止間隔繼續。

當我也對異步回調感到困惑時,回想一下我寫的這篇文章:)

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

希望對您有所幫助:)

祝好運!

執行循環將不需要10秒鍾。 Look將立即執行,匿名函數將enqueued 10次​​, enqueued 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);

我今天確實遇到了這個挑戰,@ 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); 

注意:我只是在原始解決方案中使用命名函數代替匿名函數。 謝謝。 這真的很有幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM