用到了這個(gè)工具雅镊,順便翻譯一下,便于查看
github看的舒服一點(diǎn):https://github.com/ZZES-ZVD/node-schedule
原始地址:https://github.com/node-schedule/node-schedule
Node Schedule 是一個(gè)Node.js的靈活的類似cron又不類似的任務(wù)調(diào)度庫.它允許你調(diào)度任務(wù)(任意函數(shù))在特殊的日期執(zhí)行孽惰,并循環(huán)執(zhí)行。他只在在任何給定的時(shí)間里使用一個(gè)定時(shí)器(而不是每隔一秒/一分鐘來重新判斷將要執(zhí)行的任務(wù))
使用
安裝
你可以使用 npm.
npm install node-schedule
概述
Node Schedule 是一個(gè)基于時(shí)間的調(diào)度因俐,而不是基于區(qū)間的調(diào)度化借。你可以很容易的讓他按照你的意思來干活,比如帜乞,你說“每五分鐘來運(yùn)行這個(gè)函數(shù)"司抱,你將發(fā)現(xiàn)setInterval
要更容易使用,也是更適合的黎烈。但是如果你想說"運(yùn)行這個(gè)函數(shù)在每個(gè)月的第三個(gè)星期二每個(gè)小時(shí)的20分和50分"习柠,你會(huì)發(fā)現(xiàn)你更想要Node Schedule組件。此外照棋,Node Schedule 支持windows系統(tǒng)资溃,不像cron并不支持。
注意 Node Schedule 是被設(shè)計(jì)來進(jìn)行進(jìn)程內(nèi)調(diào)度烈炭,也就是說調(diào)度任務(wù)只能在你的腳本運(yùn)行時(shí)才能有效以及調(diào)度將在執(zhí)行成功后消失溶锭。如果你需要在你腳步 不 運(yùn)行的時(shí)候調(diào)度任務(wù),那就需要考慮使用cron.
任務(wù)和調(diào)度
每個(gè)在Node Schedule的計(jì)劃任務(wù)都會(huì)被一個(gè)Job
對象所代表符隙,你可手動(dòng)創(chuàng)建任務(wù)趴捅,然后執(zhí)行 schedule()
方法來應(yīng)用一個(gè)計(jì)劃垫毙,或者使用一個(gè)方便的方法ScheduleJob()
就像下面要說的。
Job
對象是 事件觸發(fā)器
,觸發(fā)一個(gè) run
事件在每次執(zhí)行之后驻售。
他們也觸發(fā)一個(gè)scheduled
事件露久,在每次他們調(diào)度運(yùn)行的時(shí)候,
canceled
事件可以讓一個(gè)調(diào)用在它執(zhí)行之前被取消(這兩個(gè)事件都接受一個(gè)JavaScript日期對象作為一個(gè)參數(shù)). 注意這個(gè)任務(wù)會(huì)第一時(shí)間被調(diào)度欺栗,所以如果你使用 scheduleJob()
這個(gè)方便的方法來創(chuàng)建一個(gè)任務(wù),你將錯(cuò)過第一個(gè)scheduled
事件征峦,但是你能手動(dòng)查詢調(diào)用(下面會(huì)有)迟几。也要注意 canceled
是單L美式拼寫方法
Cron風(fēng)格的調(diào)度
cron的格式組成如下:
* * * * * *
┬ ┬ ┬ ┬ ┬ ┬
│ │ │ │ │ |
│ │ │ │ │ └ 一周的星期 (0 - 7) (0 or 7 is Sun)
│ │ │ │ └───── 月份 (1 - 12)
│ │ │ └────────── 月份中的日子 (1 - 31)
│ │ └─────────────── 小時(shí) (0 - 23)
│ └──────────────────── 分鐘 (0 - 59)
└───────────────────────── 秒 (0 - 59, OPTIONAL)
cron格式的例子:
var schedule = require('node-schedule');
var j = schedule.scheduleJob('42 * * * *', function(){
console.log('生命,宇宙栏笆,一切的答案类腮。。蛉加。!');
});
當(dāng)分鐘為42時(shí)蚜枢,執(zhí)行一個(gè)cron任務(wù)(例如 19:42, 20:42, etc.).
以及:
var j = schedule.scheduleJob('0 17 ? * 0,4-6', function(){
console.log('今天被ren認(rèn)出來了!');
});
每五分鐘執(zhí)行一個(gè)cron任務(wù) = */5 * * * *
不支持的cron特性
一般的, W
(最近的工作日), L
(一個(gè)月/星期的最后一天), 以及 #
(月的第n個(gè)星期) 是不支持的. 大多數(shù)流行的cron特性應(yīng)該都能工作。
cron-parser 用來解析crontab指令
基于日期的調(diào)度
就是說你特別想要一個(gè)函數(shù)在 2012年12月12日早上5:30執(zhí)行针饥。
記住在JavaScript中- 0 - 星期一, 11 - 十二月.(意思就是星期數(shù)和月份數(shù)都是從0開始計(jì)數(shù)的)
var schedule = require('node-schedule');
var date = new Date(2012, 11, 21, 5, 30, 0);
var j = schedule.scheduleJob(date, function(){
console.log('世界將在今天走向 結(jié)束.');
});
要在未來使用當(dāng)前數(shù)據(jù)厂抽,你可以使用綁定:
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';
當(dāng)調(diào)度的任務(wù)運(yùn)行時(shí),這個(gè)將會(huì)打印出'Tada!'丁眼,而不是 'Changing Data'筷凤,
這個(gè)x會(huì)在調(diào)度后立即更改.
遞歸循環(huán)規(guī)則調(diào)度
你可以創(chuàng)建遞歸規(guī)則來指定任務(wù)在何時(shí)重新調(diào)用。舉個(gè)例子苞七,考慮這個(gè)規(guī)則藐守,將在每個(gè)小時(shí)的第42分鐘執(zhí)行函數(shù):
var schedule = require('node-schedule');
var rule = new schedule.RecurrenceRule();
rule.minute = 42;
var j = schedule.scheduleJob(rule, function(){
console.log('生命,宇宙蹂风,一切的答案卢厂。。惠啄。!');
});
你也可以使用數(shù)組來指定一個(gè)允許值的列表,Range
對象來指定一個(gè)系列的開始值和結(jié)束值慎恒,帶有可選的步驟參數(shù)。舉個(gè)例子礁阁,這個(gè)將在星期4巧号,星期5,星期6和星期天的下午五點(diǎn)答應(yīng)一個(gè)信息:
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了!');
});
遞歸規(guī)則的屬性
second
minute
hour
date
month
year
dayOfWeek
注意: 值得注意的時(shí)遞歸規(guī)則的默認(rèn)的第一個(gè)屬性是
null
(除了第二個(gè),對于熟悉cron姥闭,知道默認(rèn)為0). 如果我們之前沒有明確地設(shè)定minute
為0, 信息將會(huì)在下面時(shí)間打印 5:00pm, 5:01pm, 5:02pm, ..., 5:59pm. 或許這不是你想要的.
對象字面化語法
讓事情變得簡單一點(diǎn)丹鸿,一個(gè)對象字面化語法也是支持的,就像這個(gè)例子棚品,將會(huì)在每個(gè)星期天的下午兩點(diǎn)半打印信息:
var j = schedule.scheduleJob({hour: 14, minute: 30, dayOfWeek: 0}, function(){
console.log('到了喝茶的時(shí)間!');
});
設(shè)置開始時(shí)間和結(jié)束時(shí)間
這個(gè)例子中靠欢,它將在五秒后開始廊敌,然后十秒后結(jié)束.和之前一樣支持規(guī)則。
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('到了喝茶時(shí)間!');
});
處理任務(wù)和任務(wù)調(diào)度
這兒有一些函數(shù)來從一個(gè)任務(wù)中獲取信息以及處理任務(wù)和調(diào)度
job.cancel(reshedule)
你可以讓任何任務(wù)失效门怪,使用 cancel()
方法:
j.cancel();
所有的計(jì)劃調(diào)用將會(huì)被取消骡澈。當(dāng)你設(shè)置 reschedule 參數(shù)為true,然后任務(wù)將在之后重新排列掷空。
job.cancelNext(reshedule)
這個(gè)方法將能將能取消下一個(gè)計(jì)劃的調(diào)度或者任務(wù).
當(dāng)你設(shè)置 reschedule 參數(shù)為true肋殴,然后任務(wù)將在之后重新排列。
job.reschedule(spec)
這個(gè)方法將取消所有掛起的調(diào)度坦弟,然后使用給定的規(guī)則重新注冊任務(wù).
將返回 true/false 來說明成功/失敗.
job.nextInvocation()
這個(gè)方法返回一個(gè)日期對象為這個(gè)任務(wù)的下一次調(diào)用計(jì)劃护锤,如果沒有調(diào)度安排,則返回null.
貢獻(xiàn)
這個(gè)模塊由 Matt Patenaude 最初開發(fā), 現(xiàn)在由
Tejas Manohar 和 [其他貢獻(xiàn)者] 維護(hù).
我們非常希望得到你的貢獻(xiàn). 做出有意義的和有價(jià)值貢獻(xiàn)的人酿傍,將會(huì)被給予貢獻(xiàn)的權(quán)限在他們認(rèn)為合適的地方做出貢獻(xiàn).
在跳過之前, 檢查我們[貢獻(xiàn)]向?qū)ы撁?
Copyright and license
Copyright 2015 Matt Patenaude.
Licensed under the MIT License.