Understanding node.js
在实际开发项目中,会遇到很多定时任务的工作。比如:定时导出某些数据、定时发送消息或邮件给用户、定时备份什么类型的文件等等。
一般可以写个定时器,来完成相应的需求,在node.js中自已实现也非常容易,接下来要介绍的是node-schedule来完成定时任务。
下面就用示例来说明一下node-schedule的用法。
安装:
npm install node-schedule
Cron风格定时器
var schedule = require('node-schedule');
function scheduleCronstyle(){
schedule.scheduleJob('30 * * * * *', function(){
console.log('scheduleCronstyle:' + new Date());
});
}
scheduleCronstyle();
schedule.scheduleJob的回调函数中写入要执行的任务代码,一个定时器就完成了!
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'
这样很容易根据自已的需求用简短的代码去实现。
注意:六个值之间使用空格分隔;如某个位置上有多个值可以使用逗号(m,n)分隔;如某个位置值是一个区间可以使用中划线(m-n);如某个位置的时间含有间隔执行可以使用斜线(*/n);如只有五位则默认秒为0,
第一位从分钟开始计算。 '0 17 * * 1-5':表示每周一至周五下午五点整执行一次; '*/5 12,18,21 * * 0,6':表示周六周日的12时、18时和21时,每个小时内每隔5分钟执行一次;
对象规则定时器
为了更加方便,还支持直接使用对象作为规则:
var j = schedule.scheduleJob({hour: 14, minute: 30, dayOfWeek: 0}, function(){
console.log('Time for tea!');
});
设置开始时间和结束时间
let startTime = new Date(Date.now() + 5000);
let endTime = new Date(startTime.getTime() + 5000);
var j = schedule.scheduleJob({ start: startTime, end: endTime, rule: '*/1 * * * * *' }, function(){
console.log('Time for tea!');
});
上面代码中,任务将在5秒后开始,10秒后结束,期间每秒都将执行。
Date对象规则定时器
使用指定时间的Date对象作为第一个参数,任务将在指定的时间执行:
var schedule = require('node-schedule');
var date = new Date('2017-09-26 22:00:00');
var j = schedule.scheduleJob(date, function(){
console.log('The world is going to end today.');
});
RecurrenceRule实例规则定时器
你可以通过RecurrenceRule实例声明任务触发规则:
var schedule = require('node-schedule');
var rule = new schedule.RecurrenceRule();
rule.minute = 42;
var j = schedule.scheduleJob(rule, function(){
console.log('The answer to life, the universe, and everything!');
});
上面代码中,任务将在每个小时第42分钟时执行。
我们还可以使用数组指定可接受的值列表,Range 指定起始值和结束值的范围,如下:
var rule = new schedule.RecurrenceRule();
rule.dayOfWeek = [0, new schedule.Range(4, 6)];
rule.hour = 17;
rule.minute = 0; var j = schedule.scheduleJob(rule, function(){
console.log('Today is recognized by Rebecca Black!');
});
上面代码中,任务将在星期四、星期五、星期六和星期日17点整执行。
RecurrenceRule 实例属性:
- second
- minute
- hour
- date
- month
- year
- dayOfWeek
注意:实例属性中未显示设置的属性值将默认为null(除了second属性默认为0)。 上例中如果我们没有显示设置minute为0,那么任务将17:00、17:01、17:02...17:59执行,这可能不是我们想要的。
取消定时器
示例如下,定时器对象的cancl方法即可:
var schedule = require('node-schedule');
function scheduleCancel(){
var counter = 1;
var j = schedule.scheduleJob('* * * * * *', function(){
console.log('定时器触发次数:' + counter);
counter++;
});
setTimeout(function() {
console.log('定时器取消')
j.cancel();
}, 5000);
}
scheduleCancel();
原理
利用setTimeOut和event事件进行管理,对所有加入的事件进行排序,并且计算当前时间和最近一个事件发生时间的时间间隔,然后调用setTimeOut设置回调。总的来说分两种事件,一种是一次性的,一种是周期性的,一次性任务调用完就结束,周期性的会不断地循环调用,当一个周期性事件被调用后,会根据周期生成下一个周期任务,并添加到任务列表中,重新排序。每个任务调用结束,都会计算并准备下一个任务。
值得注意的一点是,在循环任务中,每个任务需要单独new一个schedule.RecurrenceRule对象,不能公用。另外就是一点网上提的比较少的一点,如果我们对循环中的时间成员没有设置,说明我们对其不感兴趣。源代码中,未设置的时间成员为null,循环结构的匹配采用的是从分钟开始的逐步累加,如果发现某成员是null,那么就直接匹配,如果不是null,就从0开始,逐渐累加,知道完全匹配。
定时器功能大部分需求都可以借助node-schedule完成了,用它在项目中使用效果也不错,各种需求可以满足 了解更多请参见:https://github.com/node-schedule/node-schedule
Understanding node.js的更多相关文章
- Node.js入门学习笔记(三)
基于事件驱动的回调 这个问题不好回答,不过这是Node.js原生的工作方式.它是事件驱动的,这也是它为什么这么快的原因.你可以花一点时间阅读一下Felix Geisendörfer的大作 Unders ...
- Node.js 项目搭建
关于 本书致力于教会你如何用Node.js来开发应用,过程中会传授你所有所需的“高级”JavaScript知识.本书绝不是一本“Hello World”的教程. 状态 你正在阅读的已经是本书的最终版. ...
- 理解Node.js(译文)
前言 总括 :这篇文章十分生动形象的的介绍了Node,满足了读者想去了解Node的需求.作者是Node的第一批贡献者之一,德国前端大神.译者觉得作者的比喻很适合初学者理解Node,特此翻译. 译者 : ...
- [转载]Node入门 » 一本全面的Node.js教程
http://www.nodebeginner.org/index-zh-cn.html 作者: Manuel Kiessling 翻译: goddyzhao & GrayZhang & ...
- Node.js下的Hello World
Node.js技术现在可谓是如火如荼,前后端都统一为Javascript的体验绝对是受到了很多人的青睐,我都后悔以前没抽时间好好学一学Javascript了. 首先,我来介绍一下Node.js.本人实 ...
- 创业笔记-Node.js入门之基于事件驱动的回调
基于事件驱动的回调 这个问题可不好回答(至少对我来说),不过这是Node.js原生的工作方式.它是事件驱动的,这也是它为什么这么快的原因. 你也许会想花点时间读一下Felix Geisendörfer ...
- Understanding Asynchronous IO With Python 3.4's Asyncio And Node.js
[转自]http://sahandsaba.com/understanding-asyncio-node-js-python-3-4.html Introduction I spent this su ...
- Node.js Express 框架学习
转载:http://JavaScript.ruanyifeng.com/nodejs/express.html#toc0 感觉很牛的样子,不过觉得对初学者没太大用,里面很多例子用的api都没有详细的说 ...
- 从医生看病和快餐店点餐理解Node.js的事件驱动
第一个例子是关于医生看病. 在美国去看医生,需要填写大量表格,比如保险.个人信息之类,传统的基于线程的系统(thread-based system),接待员叫到你,你需要在前台填写完成这些表格,你站着 ...
随机推荐
- android EditText获取光标位置并安插字符删除字符
android EditText获取光标位置并插入字符删除字符1.获取光标位置int index = editText.getSelectionStart(); 2.在光标处插入字符int index ...
- JAVA数据结构-----枚举
枚举(Enumeration)接口虽然它本身不属于数据结构,但它在其他数据结构的范畴里应用很广. 枚举(The Enumeration)接口定义了一种从数据结构中取回连续元素的方式. 例如,枚举定义了 ...
- pxe+preseed安装配置(2)
1.tftp使用独立daemon,这样不用再安装xinet, apt-get install tftp-hpa tftpd-hpa cat /etc/default/tftpd-hpa TFTP_US ...
- 【转】eclipse技巧1
俗话说的好啊,“工于利启事,必先善其器”,如果说你的编程功底是一个枪法的话,那么强大的eclipse就是android战士们最好的武器. 这里,我们来总结eclipse的使用技巧,从而使我们的编程达到 ...
- Java实现 Base64、MD5、MAC、HMAC加密
开始对那些基本的加密还不怎么熟练,然后总结了些,写了一个测试:支持 Base64.MD5.MAC.HMAC加密,长话短说,我们都比较喜欢自己理解,看代码吧! 采用的输UTF-8的格式... packa ...
- 【反射】——Autofac 类型注册
Autofac是.net界一款轻量化的IOC组件,使用Autofac可以帮助完成代码中很多依赖注入工作.在以前文章中,介绍过Autofac的配置过程(http://www.cnblogs.com/Jn ...
- HDU 5568 sequence2 区间dp+大数
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5568 题意: 求所有长度为k的严格升序子序列的个数. 题解: 令dp[i][k]表示以i结尾的长度为 ...
- linshiwendang12--匈牙利
#include<bits/stdc++.h> #define N 10007 using namespace std; vector<int> p[N]; bool vis[ ...
- JS 学习笔记--4---运算符
1.JS 中包含的运算符有:一元运算符.二元运算符.三元运算符.算术运算符.关系运算符.逻辑运算符.位运算符.赋值运算符.其他的运算符等. 2.表达式:简单来讲就是一句代码(分号隔开),解释器会把它翻 ...
- 设计模式之适配器模式(Adapter)
适配器模式原理:适配器模式属于结构型模式,主要作用是完成功能的转换, 1.通过一个类继承目标类. 2.需要适配的类 3.适配器 代码如下: #include <iostream> usin ...