[英]Why is my setTimeout function not waiting for the time specified?
[英]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.