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 25 NodeJs
基于 Docker 开发 NodeJS 应用
Jul 30 NodeJs
使用NodeJs 开发微信公众号(三)微信事件交互实例
Mar 02 NodeJs
NodeJS连接MongoDB数据库时报错的快速解决方法
May 13 NodeJs
NodeJS整合银联网关支付(DEMO)
Nov 09 NodeJs
Nodejs进阶:如何将图片转成datauri嵌入到网页中去实例
Nov 21 NodeJs
nodejs开发——express路由与中间件
Mar 24 NodeJs
NodeJs通过async/await处理异步的方法
Oct 09 NodeJs
nodejs中art-template模板语法的引入及冲突解决方案
Nov 07 NodeJs
nodejs基于express实现文件上传的方法
Mar 19 NodeJs
Nodejs技巧之Exceljs表格操作用法示例
Nov 06 NodeJs
nodejs利用readline提示输入内容实例代码
Jul 15 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
fleaphp下不确定的多条件查询的巧妙解决方法
2008/09/11 PHP
dedecms系统的广告设置代码 基础版本
2010/04/09 PHP
3个PHP多维数组转为一维数组的方法实例
2014/03/13 PHP
Yii2中使用join、joinwith多表关联查询
2016/06/30 PHP
PHP获取星期几的常用方法小结
2018/12/18 PHP
jQuery实现360°全景拖动展示
2015/03/18 Javascript
详解JavaScript中的4种类型识别方法
2015/09/14 Javascript
javascript实现获取浏览器版本、浏览器类型
2015/12/02 Javascript
WordPress中利用AJAX异步获取评论用户头像的方法
2016/01/08 Javascript
浅谈JavaScript中的apply/call/bind和this的使用
2017/02/26 Javascript
JS实现含有中文字符串的友好截取功能分析
2017/03/13 Javascript
Bootstrap下拉菜单Dropdowns的实现代码
2017/03/17 Javascript
Iscrool下拉刷新功能实现方法(推荐)
2017/06/26 Javascript
Vue之Watcher源码解析(1)
2017/07/19 Javascript
JavaScript阻止表单提交方法(附代码)
2017/08/15 Javascript
jQuery实现的简单无刷新评论功能示例
2017/11/08 jQuery
angular5 子组件监听父组件传入值的变化方法
2018/09/30 Javascript
详解从0开始搭建微信小程序(前后端)的全过程
2019/04/15 Javascript
vue ajax 拦截原理与实现方法示例
2019/11/29 Javascript
electron踩坑之dialog中的callback解决
2020/10/06 Javascript
Python内置函数bin() oct()等实现进制转换
2012/12/30 Python
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
2016/03/30 Python
Python脚本实现自动发带图的微博
2016/04/27 Python
Python实现图片滑动式验证识别方法
2017/11/09 Python
python实现关键词提取的示例讲解
2018/04/28 Python
利用Anaconda简单安装scrapy框架的方法
2018/06/13 Python
彻底搞懂python 迭代器和生成器
2020/09/07 Python
THE OUTNET英国官网:国际设计师品牌折扣网站
2016/08/14 全球购物
艺术家策划的室内设计:Curious Egg
2019/03/06 全球购物
优秀英语专业毕业生求职信
2013/11/23 职场文书
舞蹈教师自荐信
2014/01/27 职场文书
大学应届生的自我评价
2014/03/06 职场文书
学习雷锋活动总结
2014/04/29 职场文书
小平您好观后感
2015/06/09 职场文书
2016七夕情人节感言
2015/12/09 职场文书
美国运营商 T-Mobile 以 117.83Mb/s 的速度排第一位
2022/04/21 数码科技