在实际开发项目中,会遇到很多定时任务的工作。比如:定时导出某些数据、定时发送消息或邮件给用户、定时备份什么类型的文件等等。
一般可以写个定时器,来实现相应需求。在node.js中自已实现也非常容易,接下来要介绍的是 node-schedule 来完成定时任务。
下面就用示例来说明一下 node-schedule 的用法。

模块地址:

  1. https://www.npmjs.com/package/node-schedule

安装

  1. npm install node-schedule --save
  2. //
  3. yarn add node-schedule

用法

Cron风格定时器

  1. const schedule = require('node-schedule');
  2. const scheduleCronstyle = ()=>{
  3. //每分钟的第30秒定时执行一次:
  4. schedule.scheduleJob('30 * * * * *',()=>{
  5. console.log('scheduleCronstyle:' + new Date());
  6. });
  7. }
  8. scheduleCronstyle();

schedule.scheduleJob的回调函数中写入要执行的任务代码,一个定时器就完成了!

规则参数讲解

*代表通配符

  1. * * * * * *
  2. |
  3. 每周的某一天 (0 - 7) (0 7 代表星期日)
  4. └───── 月份 (1 - 12)
  5. └────────── 每月的第几天 (1 - 31)
  6. └─────────────── 小时 (0 - 23)
  7. └──────────────────── 分钟 (0 - 59)
  8. └───────────────────────── (0 - 59, OPTIONAL)

6个占位符从左到右分别代表:秒、分、时、日、月、周几

表示通配符,匹配任意,当秒是时,表示任意秒数都触发,其它类推

下面可以看看以下传入参数分别代表的意思

  1. 每分钟的第30秒触发: '30 * * * * *'
  2. 每小时的130秒触发 '30 1 * * * *'
  3. 每天的凌晨1130秒触发 '30 1 1 * * *'
  4. 每月的11130秒触发 '30 1 1 1 * *'
  5. 2016年的111130秒触发 '30 1 1 1 2016 *'
  6. 每周11130秒触发 '30 1 1 * * 1'

每个参数还可以传入数值范围:

  1. const task1 = ()=>{
  2. // 每分钟的1-10秒都会触发,其它通配符依次类推
  3. schedule.scheduleJob('1-10 * * * * *', ()=>{
  4. console.log('scheduleCronstyle:'+ new Date());
  5. })
  6. }
  7. task1()

对象文本语法定时器

  1. const schedule = require('node-schedule');
  2. function scheduleObjectLiteralSyntax(){
  3. //dayOfWeek
  4. //month
  5. //dayOfMonth
  6. //hour
  7. //minute
  8. //second
  9. //每周一的下午16:11分触发,其它组合可以根据我代码中的注释参数名自由组合
  10. schedule.scheduleJob({hour: 16, minute: 11, dayOfWeek: 1}, function(){
  11. console.log('scheduleObjectLiteralSyntax:' + new Date());
  12. });
  13. }
  14. scheduleObjectLiteralSyntax();

基础日期对象定时器

假设您非常明确地希望一个函数在 2022年1月27日的 21:05 执行。

注意: 在JavaScript中 0 是 1月,11 是 12月。

  1. const schedule = require('node-schedule');
  2. const date = new Date(2022, 0, 27, 21, 5, 0);
  3. const job = schedule.scheduleJob(date, function(){
  4. console.log('你好!');
  5. });

要在将来使用当前数据,你可以使用 bind:

  1. const schedule = require('node-schedule');
  2. const date = new Date(2022, 0, 27, 21, 5, 0);
  3. let x = '太棒了!';
  4. const job = schedule.scheduleJob(date, function(y){
  5. console.log(y);
  6. }.bind(null,x));
  7. x = '更改数据';
  8. console.log(x);

这里将先输出: “更改数据”。计划任务执行后输出 “太棒了!”

设定开始&结束时间 定时器

在本例中,它将在5秒后运行,并在10秒后停止。ruledat支持上述内容。

  1. const startTime = new Date(Date.now() + 5000);
  2. const endTime = new Date(startTime.getTime() + 5000);
  3. const job = schedule.scheduleJob({ start: startTime, end: endTime, rule: '*/1 * * * * *' }, function(){
  4. console.log('Time for tea!');
  5. });

循环规则 定时器

你可以使用循环规则 来指定循环任务。
例:每小时42分钟执行一次函数

  1. const schedule = require('node-schedule');
  2. const rule = new schedule.RecurrenceRule();
  3. rule.minute = 42;
  4. const job = schedule.scheduleJob(rule, function(){
  5. console.log('每小时42分钟执行一次函数!');
  6. });

优雅关闭定时器

你可以优雅地关闭计划任务。
gracefulShutdown() 将取消所有计划任务并返回Promise对象。
它将等待所有任务终止。

  1. schedule.gracefulShutdown();

取消定时器

调用 定时器对象的cancl()方法即可

  1. const schedule = require('node-schedule');
  2. function scheduleCancel(){
  3. var counter = 1;
  4. const j = schedule.scheduleJob('* * * * * *', function(){
  5. console.log('定时器触发次数:' + counter);
  6. counter++;
  7. });
  8. setTimeout(function() {
  9. console.log('定时器取消')
  10. // 定时器取消
  11. j.cancel();
  12. }, 5000);
  13. }
  14. scheduleCancel();

后记

更多详情的使用方法可以参看官方文档。