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

Ann*_*lee 3 javascript cron node-cron

我正在使用该包"cron": "^1.7.1"

我想要完成一项比计划的 cron 作业花费更长的时间的任务。

下面是我的最小可行示例:

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();
Run Code Online (Sandbox Code Playgroud)

如您所见,我的作业运行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
Run Code Online (Sandbox Code Playgroud)

但是,我只想every 6 seconds在任务需要运行时收到消息6 seconds

有什么建议我做错了什么吗?

use*_*906 5

正确初始化运行标识符可以解决该问题。创建全局变量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();
Run Code Online (Sandbox Code Playgroud)