Node.js中使用循环进行异步作业调度

3

我有一个JSON任务列表,根据它们应该重复的间隔(参见unit),将任务分组。

每个任务应该按照unit的间隔every重复执行。

 items=[
           { 
                "unit" : "minute",
                "detail" :
                 [ 
                    {"every" : 3, task : "task1"}
                    {"every" : 4, task : "task2"}...
                 ] 
           },
           { 
                "unit" : "day",
                "detail" :
                 [ 
                    {"every" : 3, task : "task3"}
                    {"every" : 4, task : "task4"}...
                 ] 
           },..
    ]

我使用了一个异步函数通过 node-cron 来安排任务在每个 every unit 时间间隔内执行,例如:task1 应该每 3 分钟执行一次。

我尝试了以下代码:

var CronJob = require('cron').CronJob;
function cronify(callback) 
{
    for (var i in items)
    {
        for (var j in items[i].detail) {                        
            callback(items[i].unit,items[i].detail[j]);
        }
    }
}

cronify(function (duration, detail) {
    var when = '* * * * * *';
    switch(duration)
    {
        case 'minute' : 
            when = '* */'+detail.every+' * * * *';
            break;
        case 'hour' : 
            when = '* * */'+detail.every+' * * *';
            break;
        case 'day' :
            when = '* * * * */'+detail.every+' * *';
            break;
    }
    var job = new CronJob(when, function () {
        //Do the task for task
         }, null, true, "GMT");
    }        
});

但问题是每个任务都会独立地每秒执行一次,而不考虑通过unitevery指定的持续时间。

1个回答

2

是的,如果你在第二个位置放置星号(*),那么任务将在每个奇数分钟的每一秒都会执行,例如 * */2 * * * * 。如果你想让任务每分钟只执行一次,你可以在秒钟位置上放置0,然后将 */2 放置在分钟位置上,最终的格式为:0 */2 * * * * 。以下是示例代码:

items = [{
    "unit": "minute",
    "detail": [{
        "every": 3,
        "task": "task1"
    }, {
        "every": 4,
        "task": "task2"
    }]
}, {
    "unit": "day",
    "detail": [{
        "every": 3,
        task: "task3"
    }, {
        "every": 4,
        task: "task4"
    }]
}];
var CronJob = require('cron').CronJob;
function cronify(callback) {
    for (var i in items) {
        for (var j in items[i].detail) {
            callback(items[i].unit, items[i].detail[j]);
        }
    }
}
cronify(function(duration, detail) {
    var when = '* * * * * *';
    switch (duration) {
        case 'minute':
            when = '0 */' + detail.every + ' * * * *';
            break;
        case 'hour':
            when = '0 0 */' + detail.every + ' * * *';
            break;
        case 'day':
            when = '0 0 0 0 */' + detail.every + ' *';
            break;
    }
    var job = new CronJob(when, function (when) {
            console.log(when);
         }, null, true, "GMT");
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接