js 定时器 Timer

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 }
完整代码
js 定时器 Timer的更多相关文章
- PHP框架Swoole的一个定时器Timer特性
在各种业务型系统中,往往需要服务器在后台扫描相关数据,触发相应的统计.通知等操作. 比如对于一个项目管理系统,需要每天的特定时间内,统计每项任务的执行.到期情况.整个项目的进度等等,根据统计情况,做相 ...
- js定时器 特定时间执行某段程序的例子
定时器想必大家并不陌生吧,在本文为大家详细介绍下js中是如何实现定时器的,具体原理及代码如下. 例子: $(function(){ var handler = function(){ //www.jb ...
- C#-WebForm JS定时器
JS定时器: 1.window.setTimeout(function(){},3000) 延迟3秒执行 2.window.setInterval(function(){},3000) 也叫重复器,每 ...
- js定时器 离开当前页面任然执行的问题
今天在博客上看到有人问 js定时器-----离开当前页面原本匀速运动的div加速了,回到页面若干时间恢复匀速??? 他是js定时器控制一个盒子做旋转动画 离开页面后js还在执行 但是盒子这个dom却被 ...
- JS定时器的用法及示例
JS定时器的用法及示例 目录 js 定时器的四个方法 示例一 示例二 示例三 js 定时器的四个方法 setInterval() :按照指定的周期(以毫秒计)来调用函数或计算表达式.方法会不停地调用函 ...
- js定时器及定时器叠加问题
回武汉隔离的第二天打卡,武汉加油,逆战必胜!今天想和大家简单聊一下js定时器的问题. 1.setTimeout 延时器 在指定时间后执行一次,注意只会执行一次 当然有的时候我们想用延时器做出定时器的效 ...
- python中实现定时器Timer
实现定时器最简单的办法是就是循环中间嵌time.sleep(seconds), 这里我就不赘述了 # encoding: UTF-8 import threading #Timer(定时器)是Thre ...
- js定时器的使用(实例讲解)
在javascritp中,有两个关于定时器的专用函数,分别为: 1.倒计定时器:timename=setTimeout("function();",delaytime);2.循环定 ...
- 订餐系统之定时器Timer不定时
经过几天漫长的问题分析.处理.测试.验证,定时器Timer终于定时了,于是开始了这篇文章,希望对还在纠结于“定时器Timer不定时”的同学有所帮助,现在的方案,在系统日志中会有警告,如果您有更好的方案 ...
随机推荐
- Androd点击一个选框取消其他选框
说明: 我做的体温填报系统需要在填报体温时勾选有无特殊情况 当勾选'无'时需要将用户勾选的其他选框取消 当勾选其他选框时需要将'无'这个选框取消 效果: 代码: addTem.xml <Line ...
- java如何读取和遍历properties文件
在java项目开发过程中,使用properties文件作为配置基本上是必不可少的,很多如系统配置信息,文件上传配置信息等等都是以这种方式进行保存.同时学会操作properties文件也是java基础. ...
- MAUI VS Preview 2.1 win 下无法调试ios, 目前无解
Microsoft Visual Studio Community 2022 (64 位) - Preview 版本 17.2.0 Preview 2.1 报错 严重性 代码 说明 项目 文件 行 禁 ...
- python---反转链表
class Node: def __init__(self, data): self.data = data self.next = None class Solution: "" ...
- Sql递归查询,Sqlserver、Oracle、PG、Mysql
递归分两种:一种由父项向下级递归,另一种是由子项向上级递归.下面就这两种情况做个简单的处理. 假设有一个表treeview,包含字段 id,parentid,text 分别代表id,上级id,描述字段 ...
- springboot读取配置文件赋值给静态变量
1.实现InitializingBean接口,重写afterPropertiesSet方法,将@Value赋值给成员变量的属性赋值给静态变量,示例如下: /** * @Classname FileUt ...
- json在前后台传递的形式
json对象和json字符串的区别纠结了好久一阵子,经过查阅大量博客资料总结得,字符串形式它就是带单引号或者双引号的,对象就是没有被引号包括,可以直接进行调用属性.前后端间数据传递json形式应该是字 ...
- Java学习day5
API即应用程序编程接口,Java所包含的方法以及类很多,如果要使用他们就得了解这些的API如何使用,因为API多而复杂,我们可以通过帮助文档查询 与c/c++类似,Java通过Scanner类就可以 ...
- (转)Angular中的拦截器Interceptor
什么是拦截器? 异步操作 例子 Session 注入(请求拦截器) 时间戳(请求和响应拦截器) 请求恢复 (请求异常拦截) Session 恢复 (响应异常拦截器) 转之:http://my.osch ...
- Sentinel基础应用
Sentinel 是什么? 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel 以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度保护服务的稳定性. Sentinel ...