我的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);
答案 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贡献的相同解决方案:
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;
注意:我只是使用命名函数代替原始解决方案中的匿名函数。谢谢。这真的很有帮助