node-schedule使用介紹
node-schedule
Node Schedule 是一個Node.js的靈活的類似cron又不類似的任務排程庫.它允許你排程任務(任意函式)在特殊的日期執行,並迴圈執行。他只在在任何給定的時間裡使用一個定時器(而不是每隔一秒/一分鐘來重新判斷將要執行的任務)
使用
安裝
你可以使用 npm.
npm install node-schedule
概述
node-schedule 是一個基於時間的排程,而不是基於區間的排程。你可以很容易的讓他按照你的意思來幹活,比如,你說“每五分鐘來執行這個函式",你將發現setInterval
要更容易使用,也是更適合的。但是如果你想說"執行這個函式在每個月的第三個星期二每個小時的20分和50分",你會發現你更想要Node Schedule元件。此外,Node Schedule 支援windows系統,不像cron並不支援。
注意 Node Schedule 是被設計來進行程序內排程,也就是說排程任務只能在你的指令碼執行時才能有效以及排程將在執行成功後消失。如果你需要在你腳步 不 執行的時候排程任務,那就需要考慮使用cron.
任務和排程
每個在Node Schedule的計劃任務都會被一個Job
物件所代表,你可手動建立任務,然後執行 schedule()
方法來應用一個計劃,或者使用一個方便的方法ScheduleJob()
就像下面要說的。
Job
物件是 事件觸發器
,觸發一個 run
事件在每次執行之後。
他們也觸發一個scheduled
事件,在每次他們排程執行的時候,
canceled
事件可以讓一個呼叫在它執行之前被取消(這兩個事件都接受一個JavaScript日期物件作為一個引數). 注意這個任務會第一時間被排程,所以如果你使用 scheduleJob()
scheduled
事件,但是你能手動查詢呼叫(下面會有)。也要注意 canceled
是單L美式拼寫方法
Cron風格的排程
cron的格式組成如下:
* * * * * * ┬ ┬ ┬ ┬ ┬ ┬ │ │ │ │ │ | │ │ │ │ │ └ 一週的星期 (0 - 7) (0 or 7 is Sun) │ │ │ │ └───── 月份 (1 - 12) │ │ │ └────────── 月份中的日子 (1 - 31) │ │ └─────────────── 小時 (0 - 23) │ └──────────────────── 分鐘 (0 - 59) └───────────────────────── 秒 (0 - 59, OPTIONAL)
cron格式的例子:
var schedule = require('node-schedule');
var j = schedule.scheduleJob('42 * * * *', function(){
console.log('生命,宇宙,一切的答案。。。!');
});
當分鐘為42時,執行一個cron任務(例如 19:42, 20:42, etc.).
以及:
var j = schedule.scheduleJob('0 17 ? * 0,4-6', function(){
console.log('今天被ren認出來了!');
});
每五分鐘執行一個cron任務 = */5 * * * *
不支援的cron特性
一般的, W
(最近的工作日), L
(一個月/星期的最後一天), 以及 #
(月的第n個星期) 是不支援的. 大多數流行的cron特性應該都能工作。
基於日期的排程
就是說你特別想要一個函式在 2012年12月12日早上5:30執行。 記住在JavaScript中- 0 - 星期一, 11 - 十二月.(意思就是星期數和月份數都是從0開始計數的)
var schedule = require('node-schedule');
var date = new Date(2012, 11, 21, 5, 30, 0);
var j = schedule.scheduleJob(date, function(){
console.log('世界將在今天走向 結束.');
});
要在未來使用當前資料,你可以使用繫結:
var schedule = require('node-schedule');
var date = new Date(2012, 11, 21, 5, 30, 0);
var x = 'Tada!';
var j = schedule.scheduleJob(date, function(y){
console.log(y);
}.bind(null,x));
x = 'Changing Data';
當排程的任務執行時,這個將會打印出’Tada!’,而不是 ‘Changing Data’, 這個x會在排程後立即更改.
遞迴迴圈規則排程
你可以建立遞迴規則來指定任務在何時重新呼叫。舉個例子,考慮這個規則,將在每個小時的第42分鐘執行函式:
var schedule = require('node-schedule');
var rule = new schedule.RecurrenceRule();
rule.minute = 42;
var j = schedule.scheduleJob(rule, function(){
console.log('生命,宇宙,一切的答案。。。!');
});
你也可以使用陣列來指定一個允許值的列表,Range
物件來指定一個系列的開始值和結束值,帶有可選的步驟引數。舉個例子,這個將在星期4,星期5,星期6和星期天的下午五點答應一個資訊:
var rule = new schedule.RecurrenceRule();
rule.dayOfWeek = [0, new schedule.Range(4, 6)];
rule.hour = 17;
rule.minute = 0;
var j = schedule.scheduleJob(rule, function(){
console.log('今天我碰到klren了!');
});
遞迴規則的屬性
second
minute
hour
date
month
year
dayOfWeek
注意: 值得注意的時遞迴規則的預設的第一個屬性是
null
(除了第二個,對於熟悉cron,知道預設為0). 如果我們之前沒有明確地設定minute
為0, 資訊將會在下面時間列印 5:00pm, 5:01pm, 5:02pm, …, 5:59pm. 或許這不是你想要的.
物件字面化語法
讓事情變得簡單一點,一個物件字面化語法也是支援的,就像這個例子,將會在每個星期天的下午兩點半列印資訊:
var j = schedule.scheduleJob({hour: 14, minute: 30, dayOfWeek: 0}, function(){
console.log('到了喝茶的時間!');
});
設定開始時間和結束時間
這個例子中,它將在五秒後開始,然後十秒後結束.和之前一樣支援規則。
let startTime = new Date(Date.now() + 5000);
let endTime = new Date(startTime.getTime() + 5000);
var j = schedule.scheduleJob({ start: startTime, end: endTime, rule: '*/1 * * * * *' }, function(){
console.log('到了喝茶時間!');
});
處理任務和任務排程
這兒有一些函式來從一個任務中獲取資訊以及處理任務和排程
job.cancel(reshedule)
你可以讓任何任務失效,使用 cancel()
方法:
j.cancel();
所有的計劃呼叫將會被取消。當你設定 reschedule 引數為true,然後任務將在之後重新排列。
job.cancelNext(reshedule)
這個方法將能將能取消下一個計劃的排程或者任務. 當你設定 reschedule 引數為true,然後任務將在之後重新排列。
job.reschedule(spec)
這個方法將取消所有掛起的排程,然後使用給定的規則重新註冊任務. 將返回 true/false 來說明成功/失敗.
job.nextInvocation()
這個方法返回一個日期物件為這個任務的下一次呼叫計劃,如果沒有排程安排,則返回null.
貢獻
我們非常希望得到你的貢獻. 做出有意義的和有價值貢獻的人,將會被給予貢獻的許可權在他們認為合適的地方做出貢獻.
在跳過之前, 檢查我們[貢獻]嚮導頁面!
Copyright and license
Copyright 2015 Matt Patenaude.
Licensed under the [MIT License] license.