Javascript循环/函数/ setTimeout

时间:2017-06-25 03:56:47

标签: javascript function loops for-loop settimeout

我想每隔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;
    }
}

1 个答案:

答案 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秒计算一次,只要数组中有元素,并且你希望它们都重置并继续运行,当它们达到极限时。据我所知,计时器与彼此无关。事实上,他们已经陷入了让他们行为不端的代码中。