【问题标题】:How to delete all schedules in node-schedule?如何删除节点计划中的所有计划?
【发布时间】:2017-02-16 22:51:23
【问题描述】:

我从docs看到你可以一一删除例如...

var schedule = require('node-schedule');

 // sample announcement

 var rule = new schedule.RecurrenceRule();
 rule.dayOfWeek = [1, 2, 3, 4, 5];
 rule.minute = 50;
 rule.hour = 12;

 var message = schedule.scheduleJob("AnnouncementOne", rule, function() {
    // make my announcement
})

AnnouncementOne.cancel();

但我想要代码来获取所有预定的作业,然后循环遍历它们以删除每个作业。我认为以下获得了所有的工作......

var jobList = schedule.scheduledJobs;

以下输出到控制台...

{ 'AnnouncementOne':
   Job {
     job: [Function],
     callback: false,
     name: 'AnnouncementOne',
     trackInvocation: [Function],
     stopTrackingInvocation: [Function],
     triggeredJobs: [Function],
     setTriggeredJobs: [Function],
     cancel: [Function],
     cancelNext: [Function],
     reschedule: [Function],
     nextInvocation: [Function],
     pendingInvocations: [Function] },
  'AnnouncementTwo':
   Job {
     job: [Function],
     callback: false,
     name: 'AnnouncementTwo',
     trackInvocation: [Function],
     stopTrackingInvocation: [Function],
     triggeredJobs: [Function],
     setTriggeredJobs: [Function],
     cancel: [Function],
     cancelNext: [Function],
     reschedule: [Function],
     nextInvocation: [Function],
     pendingInvocations: [Function] } }

如何循环通过 jobList 删除每个作业?

替代代码:

var jobList = schedule.scheduledJobs;

for(jobName in jobList){
  var job = 'jobList.' + jobName;
  eval(job+'.cancel()');
}

【问题讨论】:

    标签: javascript node.js scheduled-tasks


    【解决方案1】:

    可能不是最优雅的方法,但由于 jobList 缺少长度字段,因此有一种方法可以实现:

    var schedule = require('node-schedule');
    
    // sample announcement
    
    var rule = new schedule.RecurrenceRule();
    rule.dayOfWeek = [1, 2, 3, 4, 5];
    rule.minute = 50;
    rule.hour = 12;
    
    var message = schedule.scheduleJob("Announcement0", rule, function() {
        // make my announcement
    })
    
    var message = schedule.scheduleJob("Announcement1", rule, function() {
        // make my announcement
    })
    
    var jobList = schedule.scheduledJobs;
    
    for (var i = 0; i < 2; i++) {
       eval('jobList.Announcement'+i+'.cancel()');
    }
    

    这将从列表中删除计划的作业。

    在删除之前检查作业是否存在:

    for(var i = 0; i < 2; i++){
      var job = 'jobList.Announcement'+i;
      if(eval(job) != undefined) {
        eval(job+'.cancel()');
      }
    }
    

    当然,你也可以使用for-in。请记住,如果您使用 for-in,则结果未排序,而结果在常规 for 循环中排序,因此您可能会遇到一些意外行为:

    var jobList = schedule.scheduledJobs;
    
    for(jobName in jobList){
      var job = 'jobList.' + jobName;
      eval(job+'.cancel()');
    }
    

    【讨论】:

    • 我得到`jobList.Announcement0.cancel() ^ TypeError: Cannot read property 'cancel' of undefined`我如何在尝试取消之前测试作业是否存在,因为我不确定不管它存在与否,如果存在就想删除它。
    • 您收到此错误是因为您的作业列表中不存在 DeleteTesting0。我更新了答案,在删除之前检查作业是否存在。
    • 知道了,谢谢,顺便说一句,作为一个选项,我可以通过对象并使用我添加到问题底部的代码删除每个作业吗?我不在乎是否所有作业都被删除。
    • 没关系,只要记住,如果你使用 for-in,结果是不排序的,而结果是在常规 for 循环中排序的。所以你可能会遇到一些意想不到的行为。根据我的经验,我一般远离 for-in,但我的领域主要是在前端浏览器设置中使用 JavaScript,不会出现意外行为。
    • 我会警惕使用 eval。为什么不 joblist['Announcement'+i].cancel() ?还有,为什么 scheduleJobs 没有出现在 node-schedule 文档中?
    【解决方案2】:

    最好远离eval

    const schedule = require('node-schedule');
    const _ = require('lodash');
    const j = schedule.scheduleJob('SomeDirtyWork', '42 * * * *', () => {
      // Something is going on
    });
    
    const jobNames = _.keys(schedule.scheduledJobs);
    for(let name of jobNames) schedule.cancelJob(name);
    

    【讨论】:

      【解决方案3】:
      var jobList = cron.scheduledJobs; //Get All scheduled jobs
      
      Object.values(jobList).map(job => {
        console.log("Each Job", job.name);
      
          cron.cancelJob(job.name);
        })
      

      【讨论】:

        【解决方案4】:

        一行:

        for (const job in schedule.scheduledJobs) schedule.cancelJob(job);
        

        【讨论】:

          猜你喜欢
          • 2022-01-24
          • 2017-02-16
          • 1970-01-01
          • 2019-04-13
          • 1970-01-01
          • 2019-06-24
          • 1970-01-01
          • 2020-04-09
          • 1970-01-01
          相关资源
          最近更新 更多