Node-cron:等待作业完成以执行下一个

时间:2019-09-01 17:25:22

标签: javascript cron node-cron

我正在使用软件包"cron": "^1.7.1"

我想完成一项可能比计划的cron-job花费更长时间的任务。

在我的最小可行示例下面查找:

const CronJob = require('cron').CronJob;

console.log('Before job instantiation');
const job3 = new CronJob(
  '*/2 * * * * *', async () => {
    if (job3.taskRunning) {
      return
    }

    try {
      //run longer task here
      await setTimeout(() => {
        const d = new Date();
        console.log('JOB 3 - ', d);
        job3.taskRunning = true
      }, 6000);
    } catch (err) {
      console.log(err);
    }
    job3.taskRunning = false
  }
)
console.log('After job instantiation');
job3.start();

您可以看到我的作业运行every 2 seconds并打印:

JOB 3 -  2019-09-01T17:06:22.006Z
JOB 3 -  2019-09-01T17:06:24.001Z
JOB 3 -  2019-09-01T17:06:26.002Z
JOB 3 -  2019-09-01T17:06:28.001Z

但是,由于任务需要运行every 6 seconds,因此我只想得到6 seconds消息。

有人建议我在做什么错吗?

1 个答案:

答案 0 :(得分:1)

正确初始化运行标识符可以解决该问题。创建全局变量taskRunning初始化为说未运行。然后,在调用长时间运行的任务之前,使其处于运行状态。在长时间运行的任务再次完成之前,请将其设置为不运行。添加了额外的控制台日志,以防长时间运行的任务完成并返回而不执行该任务时发生下一次触发时间。

const CronJob = require('cron').CronJob;
taskRunning=false
console.log('Before job instantiation');
const job3 = new CronJob(
  '*/2 * * * * *', async () => {
    if (taskRunning) {
      console.log('returning')
      return
    }
    taskRunning=true
    try {
      //run longer task here
      await setTimeout(() => {
        const d = new Date();
        console.log('JOB 3 - ', d);
        taskRunning = false
      }, 6000);
    } catch (err) {
      console.log(err);
    }
    
  }
)
console.log('After job instantiation');
job3.start();