custom-alarm-clock

1.0.9 • Public • Published

custom-alarm-clock

利用requestAnimationFrame(不支持的环境采用 setTimeout ,周期默认 1000/60 ms)封裝的闹钟功能插件;

主要功能包括: 定时启动,重复次数定制,暂停重启 等功能;

Installation

Using npm:

$ npm i --save custom-alarm-clock

In Node.js:

.setClock(callback, option)

const alarmClock = require('custom-alarm-clock') ;

// 1.该闹钟将在'2021/9/22 18:18:30'之后运行1次

alarmClock.setClock((task) => {
    console.log('setClock will run at 2021/9/22 18:18:30');
}, '2021/9/22 18:18:30');

// 2.该闹钟将在1000ms之后运行1次,
alarmClock.setClock((task) => {
    console.log('setClock will run 1000ms later');
}, 1000);


// 3.该闹钟将在'2021/9/22 18:18:30'之后运行,每1000ms运行一次,共运行3次
alarmClock.setClock((task) => {
    console.log('test setClock 2021/9/22 18:18:30', new Date());
}, {
    start: '2021/9/22 18:18:30',//闹钟定时,string视为指定日期,  new Date(start),number视作延迟 start ms
    count: 3,//闹钟重复次数,
    cycle: 1000,//重复间隔 ms; 0 相当于requestAnimationFrame
})

// 4.跳过某次循环
alarmClock.setClock(() => {
    console.log('设置闹钟每天9:00运行,跳过周六周日', new Date());
}, {
    start: new Date('2021/9/21 9:00:00'),//如果日期已是过去时,将其作为起点推算到下一次启动时间,cycle将会减去跳过的周期次数;
    cycle: 86400000, //24*60*60*1000
    count: Infinity,
    skip(task) {
        return !(new Date().getDay() < 6 && new Date().getDay() > 0);  // 周六周日跳过
    }
});

// 5.cycle为0时,相当于 requestAnimationFrame;
alarmClock.setClock(()=>{
    console.log('此时相当于使用requestAnimationFrame')
},{
    start:0,
    cycle: 0,
    count: Infinity,
})

上面例子中,由于Api使用 requestAnimationFrame 实现,回调函数调用的最小间隔时间是两次 requestAnimationFrame 的运行间隔时间;

假设浏览器帧率为60,那么 cycle < 1000/60 时,回调函数调用频率将不会高于60。


In Node.js:

clock .sleep() & .notify() & .delay()

闹钟可以任意暂停重启。

let count=0;
let taskObject = alarmClock.setClock((task) => {
    console.log('测试闹钟停止', new Date());
    count++;
    if(count>5){// 5s后该闹钟sleep,未被销毁;
        count=0;
        task.sleep();//callback入参为定时任务实例,可以用来临时暂停任务;
        //task.delay(); // sleep()跳过本轮运行,delay()推迟运行。 例如:8:00闹钟,今天sleep掉,1小时后notify,明天依然8:00响;8:00的闹钟delay后,1小时后notify;则明天9:00才响;
    }
}, {
    start: 0,
    cycle: 1000,
    count: Infinity
})

alarmClock.setTimeout(() => {
    console.log('alarm restart');
    taskObject.notify();//sleep的闹钟可以重新唤醒
}, 10000);

alarmClock.setClock((task) => {
     task.sleep(5000);//传入数字表示稍后自启动,ms
    //  task.delay(5000); //暂停5后自启动
},1000)

In Node.js:

Manual Operation

Asynchronous operation such as ajax requestion; you can decide when start the next circle.

异步操作如果耗时较长,或者周期较短,例如:每秒请求一次耗时1s-2s的接口;可以手动控制下次查询的开启。

alarmClock.setClock((task) => {
    console.log('测试闹钟', new Date());
    alarmClock.setTimeout(() => { //模拟异步操作
        task.next(); // 下一轮循环将在next()后开启。
    }, Math.random()*2000)
}, {
    start: 0,
    cycle: 1000, 
    count: Infinity,
    manual: true, //设置闹钟手动开启下一轮循环; 手动模式无法 .delay / .sleep
})

In Node.js:

Named Task;

如果设置了闹钟的名称(name),name相同的clock只会保留最后一个;适用于高频重复创建任务 -- 防抖操作;

//这里的task1不会启动,将被task2顶替
let task1 = alarmClock.setClock((task) => {
    console.log('测试闹钟1');
}, {
    name:'testName',//
})

let task2 = alarmClock.setClock((task) => {
    console.log('测试闹钟2');
}, {
    name:'testName',//task2 的name 与task1 相同;相当于 task1.clear()
})

In Node.js:

Task Group

设置了groupName后的闹钟可以用 .sleepGroup(groupName)/.delayGroup(groupName)/.notifyGroup(groupName) 统一操作;

const alarmClock = require('custom-alarm-clock');

let task1 = alarmClock.setClock((task) => {
    console.log('测试分组1');
}, {
    start: 0,
    cycle: 0, 
    count: 3,
    groupName:'groupName',//
    eventListener(eventName){//生命周期函数
        //eventName: created,mounted,destroyed,sleeped,notified...
    }
})

let task2 = alarmClock.setClock((task) => {
    console.log('测试分组2');
}, {
    start: 1000,
    cycle: 1000, 
    count: 3,
    groupName:'groupName',
})

alarmClock.sleepGroup('groupName');
// alarmClock.delayGroup('groupName');
// alarmClock.notifyGroup('groupName');

In Node.js:

全局Api

alarmClock.sleepAll();//用于睡眠全部运行中的闹钟
alarmClock.notifyAll();//用于唤醒全部睡眠中的闹钟
alarmClock.clearAll();//用于清除全部闹钟,释放资源

alarmClock.setTimeout();//用法与原生setTimeout类似;setTimeout(callback,Number/String/Date)
alarmClock.setInterval();//用法与原生setInterval类似;setInterval(callback,Number/Object)
alarmClock.setClock();//

In Node.js:

其他

//keyframes : [百分比]:回调函数; “百分比”是指cycle的百分比,在两个 main task 之间触发;(>=1.0.6)
alarmClock.setInterval((task) => {console.log('this is main task'}, { 
    cycle: 10000,
    count: 10,
    keyframes:{//两次main task调用之间的时间点;
        '10%':()=>{},//距离上次main task 结束1s后触发
        '30%':()=>{},//距离上次main task 结束3s后触发//距离上次main task 结束1s后触发
        '100%':()=>{},//本次main task执行前触发
    }
})

All suggestions and opinions are welcome.

QQ:454413790

Email: 454413790@qq.com

Versions

Current Tags

  • Version
    Downloads (Last 7 Days)
    • Tag
  • 1.0.9
    0
    • latest

Version History

Package Sidebar

Install

npm i custom-alarm-clock

Weekly Downloads

0

Version

1.0.9

License

ISC

Unpacked Size

70.6 kB

Total Files

18

Last publish

Collaborators

  • whyymj