前5次迭代后setInterval不起作用

时间:2019-04-19 06:09:17

标签: javascript node.js cron

我正在尝试使cron函数每randomInterval秒运行一次。

我将setInterval(cron(), randomInterval);更改为setInterval(cron, randomInterval);,这消除了最大调用堆栈错误。但这仍然不能作为可靠的cron。在前5次迭代之后,它将在不设置间隔的情况下执行cron函数。

任何帮助将不胜感激!

function cron() {
    randomInterval = randomIntFromInterval(1000, 9000);

    cronInterval = setInterval(cron, randomInterval);
}

function randomIntFromInterval(min, max) {
    return Math.floor(Math.random() * (max - min + 1) + min);
}

cron();

下面的代码对测试记录了时间间隔以及cron触发的时间。

function cron() {
    var d = new Date();

    var h = d.getHours();
    var m = d.getMinutes();

    h = (h < 10) ? "0" + h : h;
    m = (m < 10) ? "0" + m : m;

    console.log(h + ":" + m + "took screenshot ");

    randomInterval = randomIntFromInterval(1000, 9000);

    cronInterval = setInterval(cron, randomInterval);
    console.log(randomInterval/1000);
}

function randomIntFromInterval(min, max) {
    return Math.floor(Math.random() * (max - min + 1) + min);
}

cron()

1 个答案:

答案 0 :(得分:0)

您正在使用setInterval,它将在每(任意数字)N毫秒后继续执行相同的cron函数。如果要实现类似cron的功能,请使用setTimeout而不是setInterval。因为setInterval会迅速用很多回调函数填充事件队列,最终您将得到堆栈溢出或内存溢出类型的错误。

setInterval永远不会停止调用回调,除非您使其停止。您的代码正在做的是,它用大量回调填充了事件队列,从而造成了问题。

function cron() {
    var d = new Date();

    var h = d.getHours();
    var m = d.getMinutes();

    h = (h < 10) ? "0" + h : h;
    m = (m < 10) ? "0" + m : m;

    console.log(h + ":" + m + "took screenshot ");

    randomInterval = randomIntFromInterval(1000, 9000);

    cronInterval = setTimeout(cron, randomInterval); // Here change it to setTimeout
    console.log(randomInterval/1000);
}

function randomIntFromInterval(min, max) {
    return Math.floor(Math.random() * (max - min + 1) + min);
}

cron()