我想每隔5秒循环一次数组(“网站”)。在5(“cycle_timeout”)秒之后,我想调用另一个以1秒为间隔循环0到120的值的函数。当在循环之外调用looper函数时,它工作正常,但我希望它从内部循环中调用。当发生这种情况时,不会保留弯针“延迟”并且循环非常快速地从0加速到120。如何让looper以1秒的间隔继续?谢谢你的帮助。
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;
}
}
答案 0 :(得分:0)
因为这个原因,它从内部加速:
function looper () {
// stuff
callLooperIn1Second();
}
function cycle () {
// stuff
looper();
callCycleIn5Seconds();
}
Looper会每秒呼唤自己。
循环将每隔5秒调用一个循环器,每秒调用一次。
因此,每隔5秒,cycle
再次调用looper
,并且会增加计划运行的时间。您可以添加looper
第二次调用的次数。
当您第一次拨打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秒就会cycle
setInterval
looper
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();
}
,这样做的代码就会少一些同样的问题。
我建议将您的流程和日程安排代码从您实际打算做的事情中删除。
looper
当然,你可以更进一步 您可以在不同的时间间隔上运行这些内容,而不是在递归超时上运行。那没关系。
你可以让这些过程更加依赖于彼此,这也很好......除了你需要添加一个 lot 更多的计时器管理代码, cycle
在计算中的距离,以及BitmapFont
每次被解雇时的含义。
看起来这两个计数器不会以任何可能的方式相互连接。你想让一个人在2分钟内每秒计数一次,并且你希望对方每5秒计算一次,只要数组中有元素,并且你希望它们都重置并继续运行,当它们达到极限时。据我所知,计时器与彼此无关。事实上,他们已经陷入了让他们行为不端的代码中。