小小又开始进入学习状态,小小本次学习的内容是 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 laternpm http GET https://registry.npmjs.org/laternpm http 200 https://registry.npmjs.org/laternpm http GET https://registry.npmjs.org/later/-/later-1.1.6.tgznpm http 200 https://registry.npmjs.org/later/-/later-1.1.6.tgzlater@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开始,逐步累加,晓得齐全匹配。