Javascript循环/函数/setTimeout
我想每5秒循环一次数组(“站点”)。在5(“cycle_timeout”)秒之后,我想调用另一个函数,它以1秒的间隔循环0到120的值。当在循环外部调用looper函数时,它工作正常,但我希望从循环内部调用它。当这种情况发生时,活套“延迟”不会被保留,循环会从0加速到120。如何使活套以1秒的间隔继续运行?谢谢你的帮助Javascript循环/函数/setTimeout,javascript,function,loops,for-loop,settimeout,Javascript,Function,Loops,For Loop,Settimeout,我想每5秒循环一次数组(“站点”)。在5(“cycle_timeout”)秒之后,我想调用另一个函数,它以1秒的间隔循环0到120的值。当在循环外部调用looper函数时,它工作正常,但我希望从循环内部调用它。当这种情况发生时,活套“延迟”不会被保留,循环会从0加速到120。如何使活套以1秒的间隔继续运行?谢谢你的帮助 var i = 0; var l = 120; looper(); // looper runs correctly when invoked from here. functi
var i = 0;
var l = 120;
looper(); // looper runs correctly when invoked from here.
function looper() {
var Delay = 1;
console.log("i is ", i);
i = i + 1;
if (i == l) {
i = 0;
}
setTimeout(looper, Delay * 1000);
}
var sites = ["a", "b"];
var lengthsites = sites.length;
var ii = 0;
cycle();
function cycle() {
console.log("ii is ", ii);
console.log("site is ", sites[ii]);
var cycle_timeout = 5;
setTimeout(cycle, cycle_timeout * 1000);
//looper(); // looper accelerates when invoked from here.
ii = ii + 1;
if (ii == lengthsites) {
ii = 0;
}
}
它从内部加速,因为:
function looper () {
// stuff
callLooperIn1Second();
}
function cycle () {
// stuff
looper();
callCycleIn5Seconds();
}
Looper将每秒调用自己。
Cycle将每5秒调用一个活套,它将每秒调用自己。
因此,每隔5秒,cycle
再次调用looper
,并增加计划运行的时间。你增加了活套
在那一秒被调用的次数
当您第一次调用循环
,活套
将每秒运行一次。5秒后,它将每秒运行2次。
10秒后,它将每秒运行3次
cycle // call looper, which schedules every 1s
looper
looper
looper
looper
looper
cycle // call looper, which schedules every 1s
looper looper
looper looper
looper looper
looper looper
looper looper
cycle // call looper, which schedules every 1s
looper looper looper
looper looper looper
looper looper looper
looper looper looper
looper looper looper
将此项切换为使用setInterval将不起作用,因为这样您只需每隔5秒将循环
切换为活套
上的设置间隔
,这稍微少了一些代码即可完成相同的问题
我建议您将流程和调度代码与实际打算做的事情分开
let currentSecond = 0;
const totalSeconds = 120;
const sites = ["a", "b", "c"];
const totalSites = sites.length;
let siteIndex = 0;
function looper (i) {
currentSecond = (i + 1) % totalSeconds;
}
function cycle (i) {
const site = sites[i];
siteIndex = (i + 1) % totalSites;
}
function triggerLoop () {
const loopDelayMS = 1000;
looper(currentSecond);
setTimeout(triggerLoop, loopDelayMS);
}
function triggerCycle () {
const cycleDelayMS = 5000;
cycle(siteIndex);
setTimeout(triggerCycle, cycleDelayMS);
}
function run () {
triggerLoop();
triggerCycle();
}
当然,您可以更进一步。您可以在单独的时间间隔上运行这些东西,而不是在递归超时上运行。那很好 您可以使流程更加相互依赖,这也很好。。。除了您需要添加更多的计时器管理代码,以计算出
活套
的计数距离,以及它每次被触发时对循环
意味着什么
看起来这两个计数器并没有以任何可能的方式连接在一起。您希望其中一个在2分钟内每秒计数一次,另一个在数组中存在元素时每5秒计数一次,并且希望当元素达到极限时,这两个元素都重置并继续。据我所知,计时器之间没有任何关系。这只是因为他们被捆绑在代码中,导致他们行为不端。如果你编写的代码看起来像这样,你总是会有问题-缩进使事情更容易阅读(当然,你可能是个天才,我想你不需要正确格式化的代码),我忍不住注意到在编辑代码示例的格式时,有许多缺少的分号。这可能会产生各种意想不到的结果,应该首先修复、测试,如果问题仍然存在,我们可以继续。看到了吗?虽然有人在我打字时推翻了我的编辑并“修复”了它们,所以我们可能永远也不知道这是否是个问题。哎呀,我添加了缺少的
因为我是个傻瓜,所以请使用setInterval()而不是setTimeout,以便以重复方式调用函数。这样,您就不需要在函数中调用setTimeout了,函数调用了setTimeout。