Динамический временной интервал для вызова функции node.js - PullRequest
0 голосов
/ 25 декабря 2018

Я разделил день на 6 частей, и каждая часть дня имеет свой интервал.Моя функция должна работать в этих интервалах.Например, интервал с 12:00 до 15:00 составляет 10 минут, поэтому функция должна вызываться каждые 10 минут, а с 15:00 до 20:00 - 2 минуты, поэтому с 15:01 необходимо изменить интервал с 10 до 2 минут.

Нужно предложение, как построить этот тип таймера.Я могу получить интервалы из mongoDB или локального файла JSON.Я думаю, мне нужно проверить, который час и получить интервал (из файла mongoDB или json) на это время, а затем передать его в планировщик заданий setInterval() или Cron .Пробовал таким образом, но каждый раз, когда я пропускаю новый интервал, последние интервалы все еще работают: если интервал равен 2 мин, а я изменяю его на 5 мин, функция вызывается дважды: каждые 2 мин и каждые 5 мин как в setInterval(), так и Крон

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 голосов
/ 25 декабря 2018

Я думаю, что он все еще стреляет, потому что clearInterval не говорит ему остановиться.

0 голосов
/ 25 декабря 2018

Можете ли вы сделать что-то подобное?При этом используется модель 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);
...