1

我正在使用包"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

有什么建议我做错了吗?

4

1 回答 1

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();
于 2020-06-25T18:53:57.407 回答