关于node.js:学习-Nodejs-之定时任务

42次阅读

共计 2776 个字符,预计需要花费 7 分钟才能阅读完成。

小小又开始进入学习状态,小小本次学习的内容是 Node.js 的定时工作。

这里对于 Node.js 应用的是 node-schedule 定时器。所以这里总体是对 node-schedule 包的相干的学习。

装置

应用 npm 装置相干的包

npm install node-schedule --save

或者

yarn add node-schedule

应用案例

对于定时器来说,应用的通通是 Cron 格调的定时器。

const schedule = require('node-schedule');

const  scheduleCronstyle = ()=>{
  // 每分钟的第 30 秒定时执行一次:
    schedule.scheduleJob('30 * * * * *',()=>{console.log('scheduleCronstyle:' + new Date());
    }); 
}

scheduleCronstyle();

这里在其回调函数中写入要执行的工作代码,一个定时器就彻底的竣工了

Cron 格调

这里对 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)

从左到右别离代表着

 秒、分、时、日、月、周几 

例如以下的参数别离代表着相干的解释

 每分钟的第 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'

应用对象的形式,编写定时器

const schedule = require('node-schedule');

function scheduleObjectLiteralSyntax(){

    //dayOfWeek
    //month
    //dayOfMonth
    //hour
    //minute
    //second
      // 每周一的下午 16:11 分触发,其它组合能够依据我代码中的正文参数名自由组合
    schedule.scheduleJob({hour: 16, minute: 11, dayOfWeek: 1}, function(){console.log('scheduleObjectLiteralSyntax:' + new Date());
    });
   
}

scheduleObjectLiteralSyntax();

递归规定定时器

这里应用递归规定定时器

var schedule = require('node-schedule');

function scheduleRecurrenceRule(){var rule = new schedule.RecurrenceRule();
    // rule.dayOfWeek = 2;
    // rule.month = 3;
    // rule.dayOfMonth = 1;
    // rule.hour = 1;
    // rule.minute = 42;
    rule.second = 0;
    
    schedule.scheduleJob(rule, function(){console.log('scheduleRecurrenceRule:' + new Date());
    });
   
}

scheduleRecurrenceRule();

勾销定时器

这里勾销定时器应用的是 cancl 办法

const schedule = require('node-schedule');

function scheduleCancel(){

    var counter = 1;
    const j = schedule.scheduleJob('* * * * * *', function(){console.log('定时器触发次数:' + counter);
        counter++;
        
    });

    setTimeout(function() {console.log('定时器勾销')
      // 定时器勾销
        j.cancel();}, 5000);
    
}

scheduleCancel();

其余包

这里持续介绍另外一个包,Later
Later 是一个基于 Nodejs 的工具库,用最简略的形式执行定时工作。Later 能够运行在 Node 和浏览器中。

装置

Later 能够运行在 Node 和浏览器中,别离用 npm 和 bower 进行依赖治理

~ cd /home/conan/nodejs
~ mkdir nodejs-later && cd nodejs-later

~ sudo npm install later
npm http GET https://registry.npmjs.org/later
npm http 200 https://registry.npmjs.org/later
npm http GET https://registry.npmjs.org/later/-/later-1.1.6.tgz
npm http 200 https://registry.npmjs.org/later/-/later-1.1.6.tgz
later@1.1.6 node_modules/later

根本应用

创立一个每 5 分钟启动的定时器规定,输入启动工夫

var later = require('later');
var sched = later.parse.text('every 5 mins'),
    occurrences = later.schedule(sched).next(10);

for(var i=0;i<10;i++){console.log(occurrences[i]);
}

相干原理

利用 setTimeOut 和 event 事件进行治理,对所有退出的事件进行排序,并且计算以后工夫和最近一个事件产生工夫的工夫距离,而后调用 setTimeOut 设置回调。总的来说分两种事件,一种是一次性的,一种是周期性的,一次性工作调用完就完结,周期性的会一直地循环调用,当一个周期性事件被调用后,会依据周期生成下一个周期工作,并增加到工作列表中,从新排序。每个工作调用完结,都会计算并筹备下一个工作。

值得注意的一点是,在循环工作中,每个工作须要独自 new 一个 schedule.RecurrenceRule 对象,不能专用。另外就是一点网上提的比拟少的一点,如果咱们对循环中的工夫成员没有设置,阐明咱们对其不感兴趣。源代码中,未设置的工夫成员为 null, 循环构造的匹配采纳的是从分钟开始的逐渐累加,如果发现某成员是 null,那么就间接匹配,如果不是 null,就从 0 开始,逐步累加,晓得齐全匹配。

正文完
 0