首页 > 解决方案 > setInterval 在前 5 次迭代后不起作用

问题描述

我试图让 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()

标签: javascriptnode.jscron

解决方案


您正在使用 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()

推荐阅读