当前位置: 首页 > 后端技术 > Node.js

学习-Node.js的定时任务

时间:2023-04-03 23:15:22 Node.js

小小又开始学习了。本次学习的内容是Node.js的定时任务。Node.js在这里使用node-schedule定时器。那么关于node-schedule包的整体学习就到这里了。安装使用npm安装相关包npminstallnode-schedule--save或yarnaddnode-schedule用例对于定时器,全部使用Cron风格的定时器。constschedule=require('node-schedule');constscheduleCronstyle=()=>{//每分钟第30秒执行:schedule.scheduleJob('30*****',()=>{console.log('scheduleCronstyle:'+newDate());});}scheduleCronstyle();这里将要执行的任务代码写在它的回调函数中,一个定时器就完成了。这里的cronstyle是针对CronStyle的解释*****┬┬┬┬┬┬│││││|──月(1-12)│││└──────────月中的第几天(1-31)││└──────────────────────小时(0-23)│└───────────────────────────────────────────────────────────────────────────────────────────分钟────────秒(0-59,可选)从左到右表示秒、分、时、日、月和星期几。例如下面的参数表示每分钟30号秒触发:'30*****'每小时1分30秒触发:'301****'每天凌晨1:30触发:'3011***'每个月1号1:1:30触发:'30111**'2016年1月1号1:1:30触发:'301112016*'一周一号1:1:30第二次触发:'3011**1'使用对象方法,写定时器constschedule=require('node-schedule');functionscheduleObjectLiteralSyntax(){//dayOfWeek//月//dayOfMonth//小时//分钟//秒//每个星期一上午16点11分触发,其他组合可以根据我代码中的注释参数名自由组合:'+新日期());});}scheduleObjectLiteralSyntax();这里使用递归规则定时器varschedule=require('node-schedule');functionscheduleRecurrenceRule(){varrule=newschedule.RecurrenceRule();//rule.dayOfWeek=2;//规则.month=3;//rule.dayOfMonth=1;//规则.小时=1;//规则.分钟=42;规则.second=0;日程。scheduleJob(rule,function(){console.log('scheduleRecurrenceRule:'+newDate());});}scheduleRecurrenceRule();取消定时器这里使用cancl方法取消定时器constschedule=require('node-schedule');functionscheduleCancel(){varcounter=1;constj=schedule.scheduleJob('******',function(){console.log('定时器触发次数:'+counter);counter++;});setTimeout(function(){console.log('定时器取消')//定时器取消j.取消();},5000);}scheduleCancel();其他包这里我们继续介绍另外一个包,LaterLater是一个基于Nodejs的工具库,最简单的执行定时任务的方式Later可以运行在Node和浏览器中。InstallingLater可以在Node和浏览器中运行,分别使用npm和bower进行依赖管理~cd/home/conan/nodejs~mkdirnodejs-later&&cdnodejs-later~sudonpminstalllaternpmhttpGEThttps://registry.npmjs.org/laternpmhttp200https://registry.npmjs.org/laternpmhttpGEThttps://registry.npmjs.org/later/-/later-1.1.6.tgznpmhttp200https://registry.npmjs.org/later/-/later-1.1.6.tgzlater@1.1.6node_modules/later基本使用创建一个每5分钟启动一次的定时器规则,并输出启动时间varlater=require('later');varsched=later.parse.text('每5分钟'),occurrences=later.schedule(sched).next(10);for(vari=0;i<10;i++){console.log(occurrences[i]);}相关原理使用setTimeOut和event事件进行管理,对所有添加的事件进行排序,计算当前时间与最近一次事件发生时间的时间间隔,然后调用setTimeOut设置回调。一般来说,事件有两种,一种是一次性的,一种是周期性的。一次性任务一调用就结束,周期性任务会一直被调用。当一个周期性事件被调用时,它会根据周期生成下一个周期性任务,添加到任务列表中,并重新排序。在每次任务调用结束时,计算并准备下一个任务。值得注意的是,在一个循环任务中,每个任务都需要新建一个schedule.RecurrenceRule对象,不能共享。还有一点就是网上提到的比较少。如果我们在循环中不设置时间成员,则表示我们对此不感兴趣。源码中unset时间成员为null,循环结构的匹配采用从分钟开始逐步累加。如果发现某个成员为null,则直接匹配。如果不为null,则从0开始,逐渐累加。知道精确匹配。