使用循环在nodejs中进行异步作业调度
async job scheduling in nodejs using loop
我有一个 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");
}
});
但问题是每个任务每秒都会执行一次,与 unit
和 every
提到的持续时间无关。
是的,如果您将星号 (*) 放在第二位,那么在 * */2 * * * * 的情况下,任务将每隔奇数分钟执行一次。要 运行 一分钟一次的任务,你可以在几秒钟内输入 0,而不是 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");
});
我有一个 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");
}
});
但问题是每个任务每秒都会执行一次,与 unit
和 every
提到的持续时间无关。
是的,如果您将星号 (*) 放在第二位,那么在 * */2 * * * * 的情况下,任务将每隔奇数分钟执行一次。要 运行 一分钟一次的任务,你可以在几秒钟内输入 0,而不是 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");
});