我想在特定时间运行我的流程,但只是一次。 我应该使用cron job,执行然后停止作业还是使用setTimeout?哪个更好?
更新 我在node-cron模块中找到了它。我认为它比使用setTimeout更好。
Date的另一个例子
var CronJob = require('cron').CronJob;
var job = new CronJob(new Date(), function(){
//runs once at the specified date.
}, function () {
// This function is executed when the job stops
},
true /* Start the job right now */,
timeZone /* Time zone of this job. */
);
答案 0 :(得分:1)
查看node-schedule包。根据文档,您可以在确切日期安排功能。
这是2012年12月21日上午5:30安排活动的文档example ...
var schedule = require('node-schedule');
var date = new Date(2012, 11, 21, 5, 30, 0);
var j = schedule.scheduleJob(date, function(){
console.log('The world is going to end today.');
});
如果需要,您也可以取消工作
j.cancel();
答案 1 :(得分:0)
如果不起作用,请尝试使用cron尝试使用node-cron。
const cron = require('node-cron');
const moment = require('moment');
const todayMoment = moment().format();
const today = new Date();
function formatDate(date) {
/* take care of the values:
second: 0-59 same for javascript
minute: 0-59 same for javascript
hour: 0-23 same for javascript
day of month: 1-31 same for javascript
month: 1-12 (or names) is not the same for javascript 0-11
day of week: 0-7 (or names, 0 or 7 are sunday) same for javascript
*/
return `${date.getSeconds()} ${date.getMinutes() + 1} ${date.getHours()} ${date.getDate()} ${date.getMonth() + 1} ${date.getDay()}`;
}
function formatDateMoment(momentDate) {
const date = new Date(momentDate);
return `${date.getSeconds()} ${date.getMinutes() + 1} ${date.getHours()} ${date.getDate()} ${date.getMonth() + 1} ${date.getDay()}`;
// or return moment(momentDate).format('ss mm HH DD MM dddd');
}
function runJob(data) {
// or formatDateMoment
const job = cron.schedule(formatDate(data), () => {
doSomething();
});
function doSomething() {
// my code
// stop task or job
job.stop();
}
}
// todayMoment
runJob(today);
答案 2 :(得分:0)
这个问题已经发布 6 年多了,但我希望有人觉得这个答案有用。 Cron 作业不是为了运行一次而创建的;它们以指定的时间间隔运行。我想不出您永远需要运行一次 cron 作业的情况,但是如果您发现了这种情况,我希望下面的代码片段会有所帮助:
const cron = require('node-cron');
const EventEmitter = require('events');
const event = new EventEmitter();
// Make your callback function asynchronous so that you can use await
async function doSomething() {
console.log('Doing something...');
}
const task = cron.schedule('0 1 * * * *', async () => {
console.log('Running a task every minute');
await doSomething();
event.emit('JOB COMPLETED');
});
// Listen to when a 'JOB COMPLETED' event is emitted and stop the task
event.on('JOB COMPLETED', () => {
console.log('Job done!');
task.stop();
});