Nodejs在准确的时间运行一次代码

时间:2014-06-11 04:32:05

标签: node.js

我想在特定时间运行我的流程,但只是一次。 我应该使用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. */

);

3 个答案:

答案 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();
});