2016-10-07 2 views
1

я вижу из 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] } } 

как I цикл через JobList удалить каждую работу?

Альтернативный код:

var jobList = schedule.scheduledJobs; 

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

ответ

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()'); 
    } 
} 

Конечно, вы можете также использовать для-в. Просто помните, что если вы используете для в результатах не упорядочены, а результаты упорядочиваются в регулярный цикл, чтобы вы могли потенциально испытать некоторое неожиданное поведение:

var jobList = schedule.scheduledJobs; 

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

Я получаю 'jobList.Announcement0.cancel() ^ TypeError: не удается прочитать свойство 'отмена' неопределенной ' Как проверить, существует ли задание, прежде чем пытаться отменить его, так как я точно не знаю, существует ли он или нет, просто удалите его, если это произойдет. – MorningSleeper

+0

У вас есть эта ошибка, потому что DeleteTesting0 не существует в вашем списке заданий. Я обновил ответ, проверяя, существует ли работа до ее удаления. –

+0

Получил это, спасибо, кстати, как вариант, могу ли я пройти через объект и удалить каждое задание с кодом, как я добавил к нижней части вопроса? Мне все равно, удалены ли все задания. – MorningSleeper

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); 
Смежные вопросы