1 /* Timer 定时器
2
3 parameter:
4 func: Function; //定时器运行时的回调; 默认 null
5 speed: Number; //延迟多少毫秒执行一次 func; 默认 3000;
6 step: Integer; //执行多少次: 延迟speed毫秒执行一次 func; 默认 Infinity;
7 isStart: bool; //初始化时是否自动启动一次计时器(前提是 func 已被定义); 默认 true
8
9 attribute:
10 func, speed, step; //这些属性可以随时更改;
11
12 //只读属性
13 readyState: String; //定时器状态; 可能值: '', 'start', 'running', 'done'; ''表示定时器从未启动
14 number: Number; //运行的次数
15
16 method:
17 start(func, speed): this; //启动定时器 (如果定时器正在运行则什么都不会做)
18 restart(): undefined; //重启定时器
19 stop(): undefined; //停止定时器
20
21 demo:
22 //每 3000 毫秒 打印一次 timer.number, 重复 Infinity 次;
23 new Timer(timer => console.log(timer.number), 3000, Infinity);
24
25 */
26 class Timer{
27
28 #restart = -1;
29 #speed = 0;
30 #isRun = false;
31 #i = 0;
32 #readyState = ''; //start|running
33 //#paused = -1;
34
35 get number(){
36 return this.#i;
37 }
38
39 get readyState(){
40 return this.#i >= this.step ? 'done' : this.#readyState;
41 }
42
43 /* get paused(){
44 return this.#paused !== -1;
45 }
46
47 set paused(v){
48 if(v === true){
49
50 if(this.#i < this.step){
51 if(this.#paused === -1) this.#paused = this.#i;
52 this.stop();
53 }
54
55 }
56
57 else if(this.#paused !== -1){
58 this.restart();
59 this.#i = this.#paused;
60 this.#paused = -1;
61
62 }
63
64 } */
65
66 constructor(func = null, speed = 3000, step = 1, isStart = true){
67 this.func = func;
68 this.speed = speed;
69 this.step = step;
70 //this.onDone = null;
71
72 if(isStart === true && this.func !== null) this.restart();
73
74 }
75
76 copy(timer){
77 this.func = timer.func;
78 this.speed = timer.speed;
79 this.step = timer.step;
80 return this;
81 }
82
83 clone(){
84 return new this.constructor().copy(this);
85 }
86
87 start(func, time){
88 if(typeof func === 'function') this.func = func;
89 if(UTILS.isNumber(time) === true) this.speed = time;
90 this.restart();
91
92 return this;
93 }
94
95 restart(){
96 if(this.#isRun === false){
97 setTimeout(this._loop, this.speed);
98 this.#isRun = true;
99 this.#restart = -1;
100 this.#i = 0;
101 this.#readyState = 'start';
102
103 }
104
105 else{
106 this.#restart = Date.now();
107 this.#speed = this.speed;
108
109 }
110
111 }
112
113 stop(){
114 if(this.#isRun === true){
115 this.#restart = -1;
116 this.#i = this.step;
117 }
118
119 }
120
121 _loop = () => {
122
123 //重启计时器
124 if(this.#restart !== -1){
125
126 let gone = Date.now() - this.#restart;
127 this.#restart = -1;
128
129 if(gone >= this.#speed) gone = this.speed;
130 else{
131 if(this.#speed === this.speed) gone = this.#speed - gone;
132 else gone = (this.#speed - gone) / this.#speed * this.speed;
133 }
134
135 setTimeout(this._loop, gone);
136
137 this.#i = 1;
138 if(this.func !== null) this.func(this);
139
140 }
141
142 //正在运行
143 else if(this.#i < this.step){
144
145 setTimeout(this._loop, this.speed);
146
147 this.#i++;
148 if(this.#readyState !== 'running') this.#readyState = 'running';
149 if(this.func !== null) this.func(this);
150
151 }
152
153 //完成
154 else this.#isRun = false;
155
156 }
157
158 }

完整代码

parameter:
    func: Function; //定时器运行时的回调; 默认 null
    speed: Number; //延迟多少毫秒执行一次 func; 默认 3000;
    step: Integer; //执行多少次: 延迟speed毫秒执行一次 func; 默认 Infinity;
    isStart: bool; //初始化时是否自动启动一次计时器(前提是 func 已被定义); 默认 true
attribute:
    func, speed, step;  //这些属性可以随时更改;
    //只读属性
    readyState: String; //定时器状态; 可能值: '', 'start', 'running', 'done'; ''表示定时器从未启动
    number: Number;     //运行的次数
method:
    start(func, speed): this;   //启动定时器 (如果定时器正在运行则什么都不会做)
    restart(): undefined;       //重启定时器
    stop(): undefined;          //停止定时器
demo:
    //每 3000 毫秒 打印一次 timer.number, 重复 Infinity 次;
    new Timer(timer => console.log(timer.number), 3000, Infinity);
 
 

js 定时器 Timer的更多相关文章

  1. PHP框架Swoole的一个定时器Timer特性

    在各种业务型系统中,往往需要服务器在后台扫描相关数据,触发相应的统计.通知等操作. 比如对于一个项目管理系统,需要每天的特定时间内,统计每项任务的执行.到期情况.整个项目的进度等等,根据统计情况,做相 ...

  2. js定时器 特定时间执行某段程序的例子

    定时器想必大家并不陌生吧,在本文为大家详细介绍下js中是如何实现定时器的,具体原理及代码如下. 例子: $(function(){ var handler = function(){ //www.jb ...

  3. C#-WebForm JS定时器

    JS定时器: 1.window.setTimeout(function(){},3000) 延迟3秒执行 2.window.setInterval(function(){},3000) 也叫重复器,每 ...

  4. js定时器 离开当前页面任然执行的问题

    今天在博客上看到有人问 js定时器-----离开当前页面原本匀速运动的div加速了,回到页面若干时间恢复匀速??? 他是js定时器控制一个盒子做旋转动画 离开页面后js还在执行 但是盒子这个dom却被 ...

  5. JS定时器的用法及示例

    JS定时器的用法及示例 目录 js 定时器的四个方法 示例一 示例二 示例三 js 定时器的四个方法 setInterval() :按照指定的周期(以毫秒计)来调用函数或计算表达式.方法会不停地调用函 ...

  6. js定时器及定时器叠加问题

    回武汉隔离的第二天打卡,武汉加油,逆战必胜!今天想和大家简单聊一下js定时器的问题. 1.setTimeout 延时器 在指定时间后执行一次,注意只会执行一次 当然有的时候我们想用延时器做出定时器的效 ...

  7. python中实现定时器Timer

    实现定时器最简单的办法是就是循环中间嵌time.sleep(seconds), 这里我就不赘述了 # encoding: UTF-8 import threading #Timer(定时器)是Thre ...

  8. js定时器的使用(实例讲解)

    在javascritp中,有两个关于定时器的专用函数,分别为: 1.倒计定时器:timename=setTimeout("function();",delaytime);2.循环定 ...

  9. 订餐系统之定时器Timer不定时

    经过几天漫长的问题分析.处理.测试.验证,定时器Timer终于定时了,于是开始了这篇文章,希望对还在纠结于“定时器Timer不定时”的同学有所帮助,现在的方案,在系统日志中会有警告,如果您有更好的方案 ...

随机推荐

  1. shiro+springboot分析思路

    文章目录 前言 一.为什么要使用shiro 二.使用步骤 1.如何认证和授权 2.如何获取数据 总结 前言 shiro和spring security等安全框架可以用户管理和权限认证 一.为什么要使用 ...

  2. Java对象和多态

    Java对象和多态 (面向对象) 面向对象基础 面向对象程序设计(Object Oriented Programming) 对象基于类创建,类相当于一个模板,对象就是根据模板创建出来的实体(就像做月饼 ...

  3. ansible模块解析及使用

    模块一:setup(收集远程主机信息) [root@zabbix30 /]# ansible test -m setup 模块二:ping(测试主机是否在线) [root@zabbix30 /]# a ...

  4. 深度学习教程 | Seq2Seq序列模型和注意力机制

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/35 本文地址:http://www.showmeai.tech/article-det ...

  5. *CTF babyarm内核题目分析

    本文从漏洞分析.ARM64架构漏洞利用方式来讨论如何构造提权PoC达到读取root权限的文件.此题是一个ARM64架构的Linux 5.17.2 版本内核提权题目,目的是读取root用户的flag文件 ...

  6. 实践 - 搭建Redis一主两从三哨兵

    实践 - 搭建Redis一主两从三哨兵 原因: 最近在复习Redis的时候,学习到了为了提高Redis集群的高可用性,有一个模式为哨兵模式.哨兵模式的作用是为了在主节点出现阻塞或者错误,无法接收数据的 ...

  7. 国产芯片DP9637-K总线收发器替代L9637D芯片和SI9241

    DP9637可以替代L9637D,低成本解决方案,只需要做简单硬件修改,感兴趣可以留言或者联系小编了解详细资料.   主要特性    电压工作范围 6V≤VBAT≤36V    具有超低休眠电流 ...

  8. vue动态路由实现原理 addRoute

    vue新版router.addRoute基础用法 新版Vue Router中用router.addRoute来替代原有的router.addRoutes来动态添加路由.子路由 在添加子路由的时候 比如 ...

  9. XCTF练习题---CRYPTO---safer-than-rot13

    XCTF练习题---CRYPTO---safer-than-rot13 flag:no_this_is_not_crypto_my_dear 解题步骤: 1.观察题目,下载附件 2.打开后发现是个文件 ...

  10. XCTF练习题---MISC---normal_png

    XCTF练习题---MISC---normal_png flag:flag{B8B68DD7007B1E406F3DF624440D31E0} 解题步骤: 1.观察题目,下载附件 2.拿到手以后发现是 ...