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(二)--- Node.js事件模块
May 21 NodeJs
基于NodeJS的前后端分离的思考与实践(五)多终端适配
Sep 26 NodeJs
NodeJS使用jQuery选择器操作DOM
Feb 13 NodeJs
Windows系统中安装nodejs图文教程
Feb 28 NodeJs
ubuntu下安装nodejs以及升级的办法
May 08 NodeJs
基于html5和nodejs相结合实现websocket即使通讯
Nov 19 NodeJs
nodeJs爬虫获取数据简单实现代码
Mar 29 NodeJs
Nodejs中 npm常用命令详解
Jul 04 NodeJs
Ajax异步文件上传与NodeJS express服务端处理
Apr 01 NodeJs
NodeJS 实现多语言的示例代码
Sep 11 NodeJs
nodejs初始化init的示例代码
Oct 10 NodeJs
分享node.js实现简单登录注册的具体代码
Apr 26 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
实现分十页分向前十页向后十页的处理
2006/10/09 PHP
php绘制一个扇形的方法
2015/01/24 PHP
javascript 构建一个xmlhttp对象池合理创建和使用xmlhttp对象
2010/01/15 Javascript
jQuery下扩展插件和拓展函数的写法(匿名函数使用的典型例子)
2010/10/20 Javascript
Javascript中的String对象详谈
2014/03/03 Javascript
自己用jQuery写了一个图片的马赛克消失效果
2014/05/04 Javascript
通过jquery 获取URL参数并进行转码
2014/08/18 Javascript
Bootstrap按钮功能之查询按钮和重置按钮
2016/10/26 Javascript
js断点调试经验分享
2017/12/08 Javascript
浅析Vue中method与computed的区别
2018/03/06 Javascript
vue-cli 3.x 配置Axios(proxyTable)跨域代理方法
2018/09/19 Javascript
解决vue2 在mounted函数无法获取prop中的变量问题
2018/11/15 Javascript
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
2019/02/21 Javascript
关于layui的下拉搜索框异步加载数据的解决方法
2019/09/28 Javascript
jquery将json转为数据字典的实例代码
2019/10/11 jQuery
js实现数字从零慢慢增加到指定数字示例
2019/11/07 Javascript
[01:33:25]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第一场 1月24日
2021/03/11 DOTA
python获取list下标及其值的简单方法
2016/09/12 Python
对python中基于tcp协议的通信(数据传输)实例讲解
2019/07/22 Python
Python八皇后问题解答过程详解
2019/07/29 Python
python模块和包的应用BASE_PATH使用解析
2019/12/14 Python
python连接mongodb集群方法详解
2020/02/13 Python
详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据
2020/12/13 Python
CSS3制作翻转效果_动力节点Java学院整理
2017/07/11 HTML / CSS
Omio中国:全欧洲低价大巴、火车和航班搜索和比价
2018/08/09 全球购物
FORZIERI福喜利中国官网:奢侈品购物梦工厂
2019/05/03 全球购物
JENNIFER BEHR官网:各种耳环和发饰
2020/06/07 全球购物
请介绍一下WSDL的文档结构
2013/03/17 面试题
网络教育自我鉴定
2013/11/01 职场文书
销售内勤岗位职责
2014/04/15 职场文书
校园会短篇的广播稿
2014/10/21 职场文书
2014年档案管理工作总结
2014/11/17 职场文书
2015年十一国庆节演讲稿
2015/03/20 职场文书
2015新教师教学工作总结
2015/07/22 职场文书
教务处教学工作总结
2015/08/10 职场文书
mysql知识点整理
2021/04/05 MySQL