小小又开始进入学习状态,小小本次学习的内容是 Node.js 的定时工作。
这里对于 Node.js 应用的是 node-schedule 定时器。所以这里总体是对 node-schedule 包的相干的学习。
装置
应用 npm 装置相干的包
npm install node-schedule --save
或者
yarn add node-schedule
应用案例
对于定时器来说,应用的通通是 Cron 格调的定时器。
const schedule = require('node-schedule');
const scheduleCronstyle = ()=>{
// 每分钟的第 30 秒定时执行一次:
schedule.scheduleJob('30 * * * * *',()=>{console.log('scheduleCronstyle:' + new Date());
});
}
scheduleCronstyle();
这里在其回调函数中写入要执行的工作代码,一个定时器就彻底的竣工了
Cron 格调
这里对 Cron 格调进行解释
* * * * * *
┬ ┬ ┬ ┬ ┬ ┬
│ │ │ │ │ |
│ │ │ │ │ └ day of week (0 - 7) (0 or 7 is Sun)
│ │ │ │ └───── month (1 - 12)
│ │ │ └────────── day of month (1 - 31)
│ │ └─────────────── hour (0 - 23)
│ └──────────────────── minute (0 - 59)
└───────────────────────── second (0 - 59, OPTIONAL)
从左到右别离代表着
秒、分、时、日、月、周几
例如以下的参数别离代表着相干的解释
每分钟的第 30 秒触发:'30 * * * * *'
每小时的 1 分 30 秒触发:'30 1 * * * *'
每天的凌晨 1 点 1 分 30 秒触发:'30 1 1 * * *'
每月的 1 日 1 点 1 分 30 秒触发:'30 1 1 1 * *'
2016 年的 1 月 1 日 1 点 1 分 30 秒触发:'30 1 1 1 2016 *'
每周 1 的 1 点 1 分 30 秒触发:'30 1 1 * * 1'
应用对象的形式,编写定时器
const schedule = require('node-schedule');
function scheduleObjectLiteralSyntax(){
//dayOfWeek
//month
//dayOfMonth
//hour
//minute
//second
// 每周一的下午 16:11 分触发,其它组合能够依据我代码中的正文参数名自由组合
schedule.scheduleJob({hour: 16, minute: 11, dayOfWeek: 1}, function(){console.log('scheduleObjectLiteralSyntax:' + new Date());
});
}
scheduleObjectLiteralSyntax();
递归规定定时器
这里应用递归规定定时器
var schedule = require('node-schedule');
function scheduleRecurrenceRule(){var rule = new schedule.RecurrenceRule();
// rule.dayOfWeek = 2;
// rule.month = 3;
// rule.dayOfMonth = 1;
// rule.hour = 1;
// rule.minute = 42;
rule.second = 0;
schedule.scheduleJob(rule, function(){console.log('scheduleRecurrenceRule:' + new Date());
});
}
scheduleRecurrenceRule();
勾销定时器
这里勾销定时器应用的是 cancl 办法
const schedule = require('node-schedule');
function scheduleCancel(){
var counter = 1;
const j = schedule.scheduleJob('* * * * * *', function(){console.log('定时器触发次数:' + counter);
counter++;
});
setTimeout(function() {console.log('定时器勾销')
// 定时器勾销
j.cancel();}, 5000);
}
scheduleCancel();
其余包
这里持续介绍另外一个包,Later
Later 是一个基于 Nodejs 的工具库,用最简略的形式执行定时工作。Later 能够运行在 Node 和浏览器中。
装置
Later 能够运行在 Node 和浏览器中,别离用 npm 和 bower 进行依赖治理
~ cd /home/conan/nodejs
~ mkdir nodejs-later && cd nodejs-later
~ sudo npm install later
npm http GET https://registry.npmjs.org/later
npm http 200 https://registry.npmjs.org/later
npm http GET https://registry.npmjs.org/later/-/later-1.1.6.tgz
npm http 200 https://registry.npmjs.org/later/-/later-1.1.6.tgz
later@1.1.6 node_modules/later
根本应用
创立一个每 5 分钟启动的定时器规定,输入启动工夫
var later = require('later');
var sched = later.parse.text('every 5 mins'),
occurrences = later.schedule(sched).next(10);
for(var i=0;i<10;i++){console.log(occurrences[i]);
}
相干原理
利用 setTimeOut 和 event 事件进行治理,对所有退出的事件进行排序,并且计算以后工夫和最近一个事件产生工夫的工夫距离,而后调用 setTimeOut 设置回调。总的来说分两种事件,一种是一次性的,一种是周期性的,一次性工作调用完就完结,周期性的会一直地循环调用,当一个周期性事件被调用后,会依据周期生成下一个周期工作,并增加到工作列表中,从新排序。每个工作调用完结,都会计算并筹备下一个工作。
值得注意的一点是,在循环工作中,每个工作须要独自 new 一个 schedule.RecurrenceRule 对象,不能专用。另外就是一点网上提的比拟少的一点,如果咱们对循环中的工夫成员没有设置,阐明咱们对其不感兴趣。源代码中,未设置的工夫成员为 null, 循环构造的匹配采纳的是从分钟开始的逐渐累加,如果发现某成员是 null,那么就间接匹配,如果不是 null,就从 0 开始,逐步累加,晓得齐全匹配。