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

一,介绍与需求

 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());
 }
 });

效果:

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());
 }
 });

效果:

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()

效果:

三,队列

第一步:安装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,'个')
  }
 })
 };

效果:

总结

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

(0)

相关推荐

  • 深入浅析Node.js 事件循环、定时器和process.nextTick()

    什么是事件循环 尽管JavaScript是单线程的,但通过尽可能将操作放到系统内核执行,事件循环允许Node.js执行非阻塞I/O操作. 由于现代大多数内核都是多线程的,因此它们可以处理在后台执行的多个操作. 当其中一个操作完成时,内核会告诉Node.js,以便可以将相应的回调添加到 轮询队列 中以最终执行. 我们将在本主题后面进一步详细解释. 事件循环解释 当Node.js启动时,它初始化事件循环,处理提供的输入脚本(或放入 REPL ,本文档未涉及),这可能会进行异步API调用,调度计时器或

  • Nodejs极简入门教程(二):定时器

    setTimeout 和 clearTimeout 复制代码 代码如下: var obj = setTimeout(cb, ms); setTimeout 用于设置一个回调函数 cb,其在最少 ms 毫秒后被执行(并非在 ms 毫秒后马上执行).setTimeout 返回值可以作为 clearTimeout 的参数,clearTimeout 用于停止定时器,这样回调函数就不会被执行了. setInterval 和 clearInterval 复制代码 代码如下: var obj = setInt

  • 详解Node 定时器

    JavaScript 是单线程运行,异步操作特别重要. 只要用到引擎之外的功能,就需要跟外部交互,从而形成异步操作.由于异步操作实在太多,JavaScript 不得不提供很多异步语法.这就好比,有些人老是受打击, 他的抗打击能力必须变得很强,否则他就完蛋了. Node 的异步语法比浏览器更复杂,因为它可以跟内核对话,不得不搞了一个专门的库 libuv 做这件事.这个库负责各种回调函数的执行时间,毕竟异步任务最后还是要回到主线程,一个个排队执行. 为了协调异步任务,Node 居然提供了四个定时器,

  • Node.js + Redis Sorted Set实现任务队列

    需求:功能 A 需要调用第三方 API 获取数据,而第三方 API 自身是异步处理方式,在调用后会返回数据与状态 { data: "查询结果", "status": "正在异步处理中" } ,这样就需要间隔一段时间后再去调用第三方 API 获取数据.为了用户在使用功能 A 时不会因为第三方 API 正在异步处理中而必须等待,将用户请求加入任务队列中,返回部分数据并关闭请求.然后定时从任务队列里中取出任务调用第三方 API,若返回状态为"

  • 浅谈Node.js中的定时器

    Node.js中定时器的实现 上一篇博文提到,在Node中timer并不是通过新开线程来实现的,而是直接在event loop中完成.下面通过几个JavaScript的定时器示例以及Node相关源码来分析在Node中,timer功能到底是怎么实现的. JavaScript中定时器功能的特点 无论是Node还是浏览器中,都有setTimeout和setInterval这两个定时器函数,并且其工作特点基本相同,因此下面仅以Node为例进行分析. 我们知道,JavaScript中的定时器并不同于计算机

  • node.js中的定时器nextTick()和setImmediate()区别分析

    1.node中使用定时器的问题在于,它并非精确的.譬如setTimeout()设定一个任务在10ms后执行,但是在9ms后,有一个任务占用了5ms,再次轮到定时器时,已经耽误了4ms. 好了node中的定时器就简单的讲这么多. 2.看代码: 复制代码 代码如下: process.nextTick(function(){     console.log("延迟执行"); }); console.log("正常执行1"); console.log("正常执行2

  • nodejs中使用HTTP分块响应和定时器示例代码

    在本例中,将要创建一个输出纯文本的HTTP服务器,输出的纯文本每隔一秒会新增100个用换行符分隔的时间戳. require('http').createServer(function(req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); var left = 10; var interval = setInterval(function() { for(var i = 0; i< 100; i++) { res.write

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

    一,介绍与需求  1.1,介绍 定时任务(node-schedule),是针对Node.js的一种灵活的cron-like和not-cron-like作业调度程序.它允许您使用可选的递归规则将作业(任意函数)安排在特定日期执行.它在任何给定的时间只使用一个计时器(而不是每秒钟/分钟重新评估即将到来的作业). Async是一个实用模块,它为异步JavaScript提供了直接.强大的功能.async流程控制器--queue(队列),queue流程控制器是一个并行的流程控制器,但是它与parallel

  • nodejs入门教程五:连接数据库的方法分析

    本文实例讲述了nodejs入门教程之连接数据库的方法.分享给大家供大家参考,具体如下: 参考文章链接:  nodejs连接mysql 1.准备工作 在nodejs中没有mysql模块,但npm中提供了mysql,所以可以使用npm安装mysql 命令:npm install mysql, 会生成 node_modules 文件夹 ,如图 执行后发现报了一个警告,说没有package.json 这个文件,只需要执行 npm init -f 的命令就会生成一个这个文件 2.直接连接数据库 mysql

  • nodejs入门教程三:调用内部和外部方法示例

    本文实例讲述了nodejs入门教程之调用内部和外部方法.分享给大家供大家参考,具体如下: 1.创建fun.js var fun3 = require('./fun3'); var fun2 = require('./fun2'); function fun1(){ console.log("我是fun1"); //exports的方式:exports 是给 module.exports 添加属性和方法 //fun2.obj.add(1,2); //fun3.print(); //mod

  • nodejs入门教程四:URL相关模块用法分析

    本文实例讲述了nodejs入门教程之URL相关模块用法.分享给大家供大家参考,具体如下: 1.URL 模块:用于 URL 处理与解析 1)URI 与 URL : URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源. URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate(定位)这个资源. 2)URL模块中的方法: ① url.format(ur

  • nodejs入门教程六:express模块用法示例

    本文实例讲述了nodejs入门教程之express模块用法.分享给大家供大家参考,具体如下: /** * Created by Dason on 2017/3/28. */ var express = require('express'); var morgan = require('morgan');//打印日志的中间件 //创建express 的实例 var app = express(); /** * 中间件: * Connect: Node.js的中间件框架 * 分层处理:每层实现一个功

  • C++ STL入门教程(3) deque双向队列使用方法

    一.简介 deque(Double Ended Queues,双向队列)和向量很相似,但是它允许在容器头部快速插入和删除(就像在尾部一样). 二.完整程序代码 /*请务必运行以下程序后对照阅读*/ #include <deque> #include <iostream> #include <algorithm> #include <stdexcept> using namespace std; void print(int num) { cout <&

  • nodejs入门教程二:创建一个简单应用示例

    本文实例讲述了nodejs创建一个简单应用的方法.分享给大家供大家参考,具体如下: 1.创建 test.js // require 来载入 http 模块 var http = require('http'); /** * 使用 http.createServer() 方法创建服务器,返回 一个对象 * 对象有一个叫做 listen 的方法,并使用 listen 方法绑定 8000 端口. * 函数通过 request, response 参数来接收和响应数据. */ http.createSe

  • OpenStack云计算快速入门教程(1)之OpenStack及其构成简介

    该教程基于Ubuntu12.04版,它将帮助读者建立起一份OpenStack最小化安装.我是五岳之巅,翻译中多采用意译法,所以个别词与原版有出入,请大家谅解.我不是英语专业,我觉着搞技术最重要的就是理解,而不是四级和考研中那烦人的英译汉,所以我的目标是忠于原意.通俗表达,Over.英文原文在这里(http://docs.openstack.org/es@***/openstack-compute/starter/content/ ,请将ex@***中的@去掉,CU屏蔽的F词),下面步入正题: 第

  • ReactJs快速入门教程(精华版)

    现在最热门的前端框架有AngularJS.React.Bootstrap等.自从接触了ReactJS,ReactJs的虚拟DOM(Virtual DOM)和组件化的开发深深的吸引了我,下面来跟我一起领略ReactJs的风采吧~~ 文章有点长,耐心读完,你会有很大收获哦~   一.ReactJS简介 React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站.做出来以后,发现这套东西

  • Node.js+Express配置入门教程详解

    Node.js是一个Javascript运行环境(runtime).实际上它是对Google V8引擎进行了封装.V8引 擎执行Javascript的速度非常快,性能非常好.Node.js对一些特殊用例进行了优化,提供了替代的API,使得V8在非浏览器环境下运行得更好.Node.js是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快.易于扩展的网络应用.Node.js 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适合在分布式设备上运行的数据密集型

随机推荐