调用函数node.js的动态时间间隔

时间:2018-12-25 10:06:47

标签: node.js date cron setinterval scheduler

我将一天分为6个部分,一天的每个部分都有自己的间隔。我的函数必须在此间隔内运行。 例如,12:00 pm-15:00 pm的间隔是10分钟,因此必须每10分钟调用一次函数,但是15:00 pm-20:00 pm的间隔是2分钟,因此必须将15:01 pm的间隔从10min更改为2min。 / p>

需要建议如何构建这种计时器。 我可以从mongoDB或本地json文件获取间隔。 我想我必须检查现在是几点,并获取该时间的间隔(从mongoDB或json文件),然后将其传递给setInterval()Cron作业调度程序。 尝试过这种方式,但是每次im经过新的间隔时,最后一个间隔仍然有效:如果间隔为2分钟,并且im将其更改为5分钟,则会调用两次函数:setInterval()和{中的每2分钟和每5分钟{3}}

const test = (min) => {
    console.log(min);
    var intervale = setInterval(() => {
        console.log('firing', min, new Date());
    }, min);
}

const test = (min) => {
    cron.schedule(`0 */${min} * * * *`, () => {
        console.log('firing cron', new Date())
    });
}

谢谢

2 个答案:

答案 0 :(得分:0)

你能做这样的事情吗?这将使用EventEmitter模型并根据自定义时间间隔触发事件。

const eventemitter_cls = require("events").EventEmitter;
let eventemitter = new eventemitter_cls();

intervalName = "randomintervals"

let sumOfTwoNumbers = () => {
    console.log(`hello world ${(new Date()).getMinutes()} ${(new Date()).getSeconds()}` );
    // After you are done with your function, again you need to emit the event based on the time interval
    setTimeout(() => {
        eventemitter.emit(intervalName)
    }, getTimeInterval());

}

let getTimeInterval = () => {
    let currentTime = new Date();
    // put your complicated interval schedule here
    if(currentTime.getHours() >= 10 && currentTime.getHours() < 11){
        return 5000;
    }
    else if (currentTime.getHours() > 12 && currentTime.getHours() < 15) {
        return 2000;
    }
    else{
        return 1000;
    }
}

// give your function name here. the function will be called whenever someone emits intervalName
eventemitter.on(intervalName, sumOfTwoNumbers);
eventemitter.emit(intervalName);

答案 1 :(得分:0)

我认为它仍在触发,因为没有clearInterval告诉它停止。