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()

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

最新更新