NodeJs入门教程之定时器和队列


Posted in NodeJs onMarch 08, 2019

一,介绍与需求

 1.1,介绍

定时任务(node-schedule),是针对Node.js的一种灵活的cron-like和not-cron-like作业调度程序。它允许您使用可选的递归规则将作业(任意函数)安排在特定日期执行。它在任何给定的时间只使用一个计时器(而不是每秒钟/分钟重新评估即将到来的作业)。

Async是一个实用模块,它为异步JavaScript提供了直接、强大的功能。async流程控制器--queue(队列),queue流程控制器是一个并行的流程控制器,但是它与parallel的区别在于queue可以控制一次执行几个函数,而parallel只是让所有函数并行执行.

 1.2,需求

实际开发项目中,会遇到很多定时任务的工作。比如:定时导出某些数据、定时发送消息或邮件给用户、定时备份什么类型的文件等等。在当时给用户发送消息时,可能要发送的用户就不只有一两个,二是多个,这是可能就会用到队列顺序执行。

二,定时器

第一步:安装node-schedule

npm install node-schedule --save

第二步:封装定时器模块

const schedule = require('node-schedule');//定时器
const nodeTimer = {};
let cancelTimer = ''
/**
 *Cron风格定时器/对象文本语法定时器
 * @param executionTime :定时器字符串'30 * * * * *'/定时器对象{hour: 16, minute: 11, dayOfWeek: 1}
 * @param callback :回调函数
 */
nodeTimer.scheduleTimer = (executionTime = '30 * * * * *', callback) => {
 // 每分钟的第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'
 
 cancelTimer = schedule.scheduleJob(executionTime, () => {
 if (typeof callback === 'function') {
 callback()
 }
 });

}
module.exports = nodeTimer;

第三步:调用

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

引入定时器模块:

const nodeTimer = require('./node_timer.js');

1,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)

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'
// 每分钟的1-10秒都会触发,其它通配符依次类推 :'1-10 * * * * *'

调用定时器:

nodeTimer.scheduleTimer('30 * * * * *',function(err){
 if(!err){
 console.log('scheduleTimer:' + new Date());
 }
 });

效果:

NodeJs入门教程之定时器和队列

2、对象文本语法定时器

  • second (0-59)
  • minute (0-59)
  • hour (0-23)
  • date (1-31)
  • month (0-11)
  • year
  • dayOfWeek (0-6) Starting with Sunday
//每周一的下午15:03:30触发,其它组合可以根据我代码中的注释参数名自由组合
nodeTimer.scheduleTimer({hour: 15, minute: 3, second: 30},function(err){
 if(!err){
 console.log('scheduleTimer:' + new Date());
 }
 });

效果:

NodeJs入门教程之定时器和队列

3、基于日期的定时器

var date = new Date(2019, 01, 07, 15, 03, 30);
nodeTimer.scheduleTimer(date,function(err){
 if(!err){
  console.log('scheduleTimer:' + new Date());
 }
 });

4、递归规则定时器

参数与对象文本语法定时器的参数类似

var rule = new schedule.RecurrenceRule();
rule.dayOfWeek = [0, new schedule.Range(4, 6)];//每周四,周五,周六执行
rule.hour = 15;
rule.minute = 0;
nodeTimer.scheduleTimer(rule,function(err){
 if(!err){
  console.log('scheduleTimer:' + new Date());
 }
 });

5、取消定时器

// 取消定时器
// 调用 定时器对象的cancl()方法即可
nodeTimer.scheduleCancel = () => {
 // 定时器取消
 cancelTimer.cancel();
 console.log('定时器成功取消');
}

调用:

nodeTimer.scheduleCancel()

效果:

NodeJs入门教程之定时器和队列

三,队列

第一步:安装async

npm install --save async

第二步:封装方法

queue相当于一个加强版的parallel,主要是限制了worker数量,不再一次性全部执行。当worker数量不够用时,新加入的任务将会排队等候,直到有新的worker可用。

该函数有多个点可供回调,如worker用完时、无等候任务时、全部执行完时等。

const async = require('async');
 /**
 *队列
 * @param obj :obj对象 包含执行时间
 * @param callback :回调函数
 */
const nodeQueue = async.queue(function (obj, callback) {
 setTimeout(function () {
 // 需要执行的代码的回调函数
 if(typeof callback==='function'){
  callback();
 }
 }, obj.time)
}, 1)

// worker数量将用完时,会调用saturated函数
nodeQueue.saturated = function() { 
 console.log('all workers to be used'); 
}
 
// 当最后一个任务交给worker执行时,会调用empty函数
nodeQueue.empty = function() { 
 console.log('no more tasks wating'); 
}
 
// 当所有任务都执行完时,会调用drain函数
nodeQueue.drain = function() { 
 console.log('all tasks have been processed'); 
}
module.exports = nodeQueue;

第三步:调用方法

const nodeQueue = require('./node_queue.js');
 for (let i = 0; i < 10; i++) {
 nodeQueue.push({ name: 1, time: 2000 }, function (err) {
  console.log('队列执行错误信息==',err);
  if(!err){
  // 需要执行的代码或函数
  console.log('需要执行的代码或函数第',i+1,'个')
  }
 })
 };

效果:

NodeJs入门教程之定时器和队列

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

NodeJs 相关文章推荐
NodeJS的模块写法入门(实例代码)
Mar 07 NodeJs
Nodejs极简入门教程(二):定时器
Oct 25 NodeJs
Nodejs实现的一个静态服务器实例
Dec 06 NodeJs
NodeJS学习笔记之Connect中间件应用实例
Jan 27 NodeJs
Nodejs的express使用教程
Nov 23 NodeJs
详解nodejs 文本操作模块-fs模块(四)
Dec 22 NodeJs
详解nodeJS之路径PATH模块
May 31 NodeJs
nodejs 图解express+supervisor+ejs的用法(推荐)
Sep 08 NodeJs
nodeJs实现基于连接池连接mysql的方法示例
Feb 10 NodeJs
nodejs(officegen)+vue(axios)在客户端导出word文档的方法
Jul 31 NodeJs
nodejs中用npm初始化来创建package.json的实例讲解
Oct 10 NodeJs
Nodejs处理异常操作示例
Dec 25 NodeJs
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
Mar 02 #NodeJs
nodejs同步调用获取mysql数据时遇到的大坑
Mar 02 #NodeJs
Nodejs中怎么实现函数的串行执行
Mar 02 #NodeJs
Nodejs让异步变成同步的方法
Mar 02 #NodeJs
nodejs使用async模块同步执行的方法
Mar 02 #NodeJs
NodeJS实现同步的方法
Mar 02 #NodeJs
PHPStorm中如何对nodejs项目进行单元测试详解
Feb 28 #NodeJs
You might like
如何判断php数组的维度
2013/06/10 PHP
PHP遍历某个目录下的所有文件和子文件夹的实现代码
2013/06/28 PHP
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
2014/06/04 PHP
PHP贪婪算法解决0-1背包问题实例分析
2015/03/23 PHP
讨论javascript(一)工厂方式 js面象对象的定义方法
2009/12/15 Javascript
javascript 函数使用说明
2010/04/07 Javascript
JavaScript 大数据相加的问题
2011/08/03 Javascript
如何用ajax来创建一个XMLHttpRequest对象
2012/12/10 Javascript
Jquery利用mouseenter和mouseleave实现鼠标经过弹出层且可以点击
2014/02/12 Javascript
JS实现的简洁纵向滑动菜单(滑动门)效果
2015/10/19 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
2016/06/12 Javascript
json与jsonp知识小结(推荐)
2016/08/16 Javascript
微信小程序商城项目之淘宝分类入口(2)
2017/04/17 Javascript
深入浅析js原型链和vue构造函数
2018/10/25 Javascript
微信小程序之swiper滑动面板用法示例
2018/12/04 Javascript
基于Vue的侧边目录组件的实现
2020/02/05 Javascript
Vue中watch、computed、updated三者的区别及用法
2020/07/27 Javascript
Python OpenCV 直方图的计算与显示的方法示例
2018/02/08 Python
Python 查找字符在字符串中的位置实例
2018/05/02 Python
python数字图像处理实现直方图与均衡化
2018/05/04 Python
在dataframe两列日期相减并且得到具体的月数实例
2018/07/03 Python
详解python 注释、变量、类型
2018/08/10 Python
Python解析Excle文件中的数据方法
2018/10/23 Python
用pycharm开发django项目示例代码
2018/10/24 Python
python PyQt5/Pyside2 按钮右击菜单实例代码
2019/08/17 Python
WxPython实现无边框界面
2019/11/18 Python
python实现滑雪游戏
2020/02/22 Python
协程Python 中实现多任务耗资源最小的方式
2020/10/19 Python
python 利用matplotlib在3D空间中绘制平面的案例
2021/02/06 Python
HTML5 File API改善网页上传功能
2009/08/19 HTML / CSS
德国价格合理的品牌商品购物网站:averdo
2019/03/21 全球购物
编写类String 的构造函数、析构函数和赋值函数
2012/09/09 面试题
高分子材料与工程专业个人求职信
2013/12/15 职场文书
法人代表授权委托书范文
2014/09/10 职场文书
2015高考寄语集锦
2015/02/27 职场文书
地球上的星星观后感
2015/06/02 职场文书