node實(shí)現(xiàn)定時(shí)任務(wù)的方法:1、利用setTimeOut和event事件進(jìn)行管理;2、對(duì)所有加入的事件進(jìn)行排序,并且計(jì)算當(dāng)前時(shí)間和最近一個(gè)事件發(fā)生時(shí)間的時(shí)間間隔;3、調(diào)用setTimeOut設(shè)置回調(diào)即可。
node.js極速入門課程:進(jìn)入學(xué)習(xí)
本教程操作環(huán)境:linux7.3系統(tǒng)、node18.4.0版、Dell G3電腦。
node怎么實(shí)現(xiàn)定時(shí)任務(wù)?
node定時(shí)任務(wù)(node-schedule模塊)
實(shí)現(xiàn)一個(gè)每天凌晨十二點(diǎn)更新服務(wù)器上的git代碼的功能
koa2框架下的app.js文件
import schedule from 'node-schedule'; import updateCode from './controllers/hcpLan/fetch' const app = new Koa(); const router = new Router(); router.get( '/', (ctx, next) => { ctx.body = 'hello' }); app.use(router.routes()).use(router.allowedMethods()); let rule = new schedule.RecurrenceRule() /**每天的凌晨12點(diǎn)更新代碼*/ rule.hour = 0 rule.minute = 0 rule.second = 0 /**啟動(dòng)任務(wù)*/ schedule.scheduleJob(rule, () => { updateCode.cloneRepo(); console.log('代碼更新了!'); }) app.listen(3000)
node-schedule原理:利用setTimeOut和event事件進(jìn)行管理,對(duì)所有加入的事件進(jìn)行排序,并且計(jì)算當(dāng)前時(shí)間和最近一個(gè)事件發(fā)生時(shí)間的時(shí)間間隔,然后調(diào)用setTimeOut設(shè)置回調(diào)。總的來說分兩種事件,一種是一次性的,一種是周期性的,一次性任務(wù)調(diào)用完就結(jié)束,周期性的會(huì)不斷地循環(huán)調(diào)用,當(dāng)一個(gè)周期性事件被調(diào)用后,會(huì)根據(jù)周期生成下一個(gè)周期任務(wù),并添加到任務(wù)列表中,重新排序。每個(gè)任務(wù)調(diào)用結(jié)束,都會(huì)計(jì)算并準(zhǔn)備下一個(gè)任務(wù)。
一、設(shè)置定時(shí)器
node-schedule允許多種規(guī)則去實(shí)現(xiàn)定時(shí)
1. Cron風(fēng)格定時(shí)器
* * * * * * ┬ ┬ ┬ ┬ ┬ ┬ │ │ │ │ │ | │ │ │ │ │ └ 一周的星期 (0 - 7) (0 or 7 is Sun) │ │ │ │ └───── 月份 (1 - 12) │ │ │ └────────── 月份中的日子 (1 - 31) │ │ └─────────────── 小時(shí) (0 - 23) │ └──────────────────── 分鐘 (0 - 59) └───────────────────────── 秒 (0 - 59, OPTIONAL) var schedule = require('node-schedule'); //當(dāng)分鐘為42時(shí),執(zhí)行一個(gè)cron任務(wù) var j = schedule.scheduleJob('42 * * * *', function(){ console.log('執(zhí)行了!'); });
2.Date對(duì)象規(guī)則定時(shí)器
var schedule = require('node-schedule'); var date = new Date('2017-09-26 22:00:00'); var j = schedule.scheduleJob(date, function(){ console.log('執(zhí)行了!'); });
3.RecurrenceRule實(shí)例規(guī)則定時(shí)器
var schedule = require('node-schedule'); var rule = new schedule.RecurrenceRule(); rule.minute = 42; var j = schedule.scheduleJob(rule, function(){ console.log('執(zhí)行了!'); });
具體使用可查看github文檔https://github.com/node-schedule/node-schedule
推薦學(xué)習(xí):《nodejs視頻教程》