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不定时”的同学有所帮助,现在的方案,在系统日志中会有警告,如果您有更好的方案 ...
随机推荐
- 手把手教你从零写一个简单的 VUE--模板篇
教程目录1.手把手教你从零写一个简单的 VUE2.手把手教你从零写一个简单的 VUE--模板篇 Hello,我又回来了,上一次的文章教会了大家如何书写一个简单 VUE,里面实现了VUE 的数据驱动视图 ...
- 一个抽取百度定位的教程(下载百度地图Demo+配置+抽取)
效果展示 已经下载Demo的可以直接到第五步,已经配置好的并可以运行的可以直接到第七步. 1.在浏览器搜索 " 百度定位API ",点击下面这个链接 2.翻到最下面找到并点击 &q ...
- ssm 框架实现增删改查CRUD操作(Spring + SpringMVC + Mybatis 实现增删改查)
ssm 框架实现增删改查 SpringBoot 项目整合 一.项目准备 1.1 ssm 框架环境搭建 1.2 项目结构图如下 1.3 数据表结构图如下 1.4 运行结果 二.项目实现 1. Emplo ...
- 一篇文章带你整明白HTTP缓存知识
最近看了很多关于缓存的文章, 每次看完,看似明白但是实际还是没明白,这次总算搞明白协商缓存是怎么回事了 首先,服务器缓存分强制缓存和协商缓存(也叫对比缓存) 强制缓存一般是服务端在请求头携带字段Exp ...
- Qt QTableView 表格内添加控件
目录 Qt QTableView 表格内添加控件 1. QItemDelegate 2. setIndexWidget 3. setIndexWidget + setLayout Qt QTableV ...
- Node.js躬行记(17)——UmiJS版本升级
在2020年我刚到公司的时候,公司使用的版本还是1.0,之后为了引入微前端,迫不得已被动升级. 一.从 1.0 到 2.0 在官方文档中,有专门一页讲如何升级的,这个用户体验非常好. 一个清单列的非常 ...
- 第一阶段:Java基础之数组
注意点: @Java语言是把数组当作一个"对象"来看待的 @把数组分为两部分看,一部分是数组的引用,放置在栈内存中,一部分是数组对象,放置在堆内存中 @数组的引用可以指向任何有效的 ...
- Servlet实现登录注册
1.注册页面register.html <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- drf路由组件(4星)
路由组件(4星) 路由Routers 对于视图集ViewSet, 我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用Routers来帮助我们快速实现路由信息. REST f ...
- linux目录结构知识
1.系统目录结构介绍 1.目录结构特点 linux系统中的目录一切从根开始. Linux系统中的目录结构拥有层次. Linux系统中的目录需要挂载使用. 2.目录挂载初识 挂载的命令:mount mo ...