在实际开发项目中,会遇到很多定时任务的工作。比如:定时导出某些数据、定时发送消息或邮件给用户、定时备份什么类型的文件等等。
一般可以写个定时器,来实现相应需求。在node.js中自已实现也非常容易,接下来要介绍的是 node-schedule 来完成定时任务。
下面就用示例来说明一下 node-schedule 的用法。
模块地址:
https://www.npmjs.com/package/node-schedule
安装
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();
schedule.scheduleJob的回调函数中写入要执行的任务代码,一个定时器就完成了!
规则参数讲解
*代表通配符
* * * * * *┬ ┬ ┬ ┬ ┬ ┬│ │ │ │ │ |│ │ │ │ │ └ 每周的某一天 (0 - 7) (0 或 7 代表星期日)│ │ │ │ └───── 月份 (1 - 12)│ │ │ └────────── 每月的第几天 (1 - 31)│ │ └─────────────── 小时 (0 - 23)│ └──────────────────── 分钟 (0 - 59)└───────────────────────── 秒 (0 - 59, OPTIONAL)
6个占位符从左到右分别代表:秒、分、时、日、月、周几
表示通配符,匹配任意,当秒是时,表示任意秒数都触发,其它类推
下面可以看看以下传入参数分别代表的意思
每分钟的第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 task1 = ()=>{// 每分钟的1-10秒都会触发,其它通配符依次类推schedule.scheduleJob('1-10 * * * * *', ()=>{console.log('scheduleCronstyle:'+ new Date());})}task1()
对象文本语法定时器
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();
基础日期对象定时器
假设您非常明确地希望一个函数在 2022年1月27日的 21:05 执行。
注意: 在JavaScript中 0 是 1月,11 是 12月。
const schedule = require('node-schedule');const date = new Date(2022, 0, 27, 21, 5, 0);const job = schedule.scheduleJob(date, function(){console.log('你好!');});
要在将来使用当前数据,你可以使用 bind:
const schedule = require('node-schedule');const date = new Date(2022, 0, 27, 21, 5, 0);let x = '太棒了!';const job = schedule.scheduleJob(date, function(y){console.log(y);}.bind(null,x));x = '更改数据';console.log(x);
这里将先输出: “更改数据”。计划任务执行后输出 “太棒了!”
设定开始&结束时间 定时器
在本例中,它将在5秒后运行,并在10秒后停止。ruledat支持上述内容。
const startTime = new Date(Date.now() + 5000);const endTime = new Date(startTime.getTime() + 5000);const job = schedule.scheduleJob({ start: startTime, end: endTime, rule: '*/1 * * * * *' }, function(){console.log('Time for tea!');});
循环规则 定时器
你可以使用循环规则 来指定循环任务。
例:每小时42分钟执行一次函数
const schedule = require('node-schedule');const rule = new schedule.RecurrenceRule();rule.minute = 42;const job = schedule.scheduleJob(rule, function(){console.log('每小时42分钟执行一次函数!');});
优雅关闭定时器
你可以优雅地关闭计划任务。
gracefulShutdown() 将取消所有计划任务并返回Promise对象。
它将等待所有任务终止。
schedule.gracefulShutdown();
取消定时器
调用 定时器对象的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();
后记
更多详情的使用方法可以参看官方文档。
