Javascript循环/函数/setTimeout

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

我想每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.
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秒计数一次,并且希望当元素达到极限时,这两个元素都重置并继续。据我所知,计时器之间没有任何关系。这只是因为他们被捆绑在代码中,导致他们行为不端。

如果你编写的代码看起来像这样,你总是会有问题-缩进使事情更容易阅读(当然,你可能是个天才,我想你不需要正确格式化的代码),我忍不住注意到在编辑代码示例的格式时,有许多缺少的分号。这可能会产生各种意想不到的结果,应该首先修复、测试,如果问题仍然存在,我们可以继续。看到了吗?虽然有人在我打字时推翻了我的编辑并“修复”了它们,所以我们可能永远也不知道这是否是个问题。哎呀,我添加了缺少的