【问题标题】:Stop Cron Job inside the scheduler Node.js在调度程序 Node.js 中停止 Cron 作业
【发布时间】:2021-12-26 20:32:08
【问题描述】:

我创建了一个 cron-job 来运行任务,我希望它在调度程序内的某个特定条件下停止,但它不起作用。

如何停止调度程序内的 cron 作业?

这是我的代码:

// cron-job.js
const cron = require('node-cron');

const scheduler = cron.schedule('* * * * *', () => {
    
    let result = fetchResultAfterSomeOperation();
    if (result < 20) {
        scheduler.stop();  //------------------------ It doesn't work
    }
}, {
    scheduled: false
});

scheduler.start();

【问题讨论】:

  • fetchResultAfterSomeOperation() 是异步的吗?如果是这样,那么它会返回一个承诺并且if 语句将不会执行。如果是这种情况,请使用 await 并使您的匿名函数异步,例如 async () => {}。另外,请确保结果的返回不是未定义的。这也会使if 声明无效。
  • 不,它不是异步的......我要说的是......控制进入 if 语句但scheduler.stop() 不起作用,我不知道为什么它不是工作。
  • 更新问题以便于理解

标签: javascript node.js cron backend node-cron


【解决方案1】:

如何创建 cron 作业?

实际上,Cron 作业是从父进程创建的。因此父进程可以具有杀死或挂起子进程的能力或特性。所以这里 node-cron 可能会这样工作。

现在来看看你的问题,你已经使用cron.schedule(time,callback) 提交了 cron 任务。现在回调将在单独的子进程上运行。因此,即使您使用 scheduler 对象来停止 cron 任务,它也不会工作。 scheduler 可以从主进程(即 cron.js 文件)停止子进程。

所以我建议你重构你的代码。

【讨论】:

    【解决方案2】:

    根据@Faizul Ahemed 的建议,您可以将代码更改为以下内容:

    const cron = require('node-cron');
    let result = null
    
    const seachFunction = () => {
       if (!result) fetchResults();
    }
    
    const scheduler = cron.schedule('*/10 * * * * *', searchFunction, { scheduled: false });
    
    scheduler.start();
    setTimeout(() => { scheduler.stop() }, 5 * 60 * 1000)
    

    上述代码将导致fetchResults 函数在setTimeout 设置的持续时间y 内每x 次获取/获取数据。

    【讨论】:

    • 我已经尝试使用setTimeout 并且它正在工作。同样正如@Faizul 所说,cron-jobs 是作为子进程执行的,但是 setTimeout 如何能够停止该进程。能解释一下setTimeout和子进程的关系吗?
    猜你喜欢
    • 2018-05-06
    • 2010-11-19
    • 2011-05-28
    • 2013-12-19
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    相关资源
    最近更新 更多