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. 手把手教你从零写一个简单的 VUE--模板篇

    教程目录1.手把手教你从零写一个简单的 VUE2.手把手教你从零写一个简单的 VUE--模板篇 Hello,我又回来了,上一次的文章教会了大家如何书写一个简单 VUE,里面实现了VUE 的数据驱动视图 ...

  2. 一个抽取百度定位的教程(下载百度地图Demo+配置+抽取)

    效果展示 已经下载Demo的可以直接到第五步,已经配置好的并可以运行的可以直接到第七步. 1.在浏览器搜索 " 百度定位API ",点击下面这个链接 2.翻到最下面找到并点击 &q ...

  3. ssm 框架实现增删改查CRUD操作(Spring + SpringMVC + Mybatis 实现增删改查)

    ssm 框架实现增删改查 SpringBoot 项目整合 一.项目准备 1.1 ssm 框架环境搭建 1.2 项目结构图如下 1.3 数据表结构图如下 1.4 运行结果 二.项目实现 1. Emplo ...

  4. 一篇文章带你整明白HTTP缓存知识

    最近看了很多关于缓存的文章, 每次看完,看似明白但是实际还是没明白,这次总算搞明白协商缓存是怎么回事了 首先,服务器缓存分强制缓存和协商缓存(也叫对比缓存) 强制缓存一般是服务端在请求头携带字段Exp ...

  5. Qt QTableView 表格内添加控件

    目录 Qt QTableView 表格内添加控件 1. QItemDelegate 2. setIndexWidget 3. setIndexWidget + setLayout Qt QTableV ...

  6. Node.js躬行记(17)——UmiJS版本升级

    在2020年我刚到公司的时候,公司使用的版本还是1.0,之后为了引入微前端,迫不得已被动升级. 一.从 1.0 到 2.0 在官方文档中,有专门一页讲如何升级的,这个用户体验非常好. 一个清单列的非常 ...

  7. 第一阶段:Java基础之数组

    注意点: @Java语言是把数组当作一个"对象"来看待的 @把数组分为两部分看,一部分是数组的引用,放置在栈内存中,一部分是数组对象,放置在堆内存中 @数组的引用可以指向任何有效的 ...

  8. Servlet实现登录注册

    1.注册页面register.html <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  9. drf路由组件(4星)

    路由组件(4星) 路由Routers 对于视图集ViewSet, 我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用Routers来帮助我们快速实现路由信息. REST f ...

  10. linux目录结构知识

    1.系统目录结构介绍 1.目录结构特点 linux系统中的目录一切从根开始. Linux系统中的目录结构拥有层次. Linux系统中的目录需要挂载使用. 2.目录挂载初识 挂载的命令:mount mo ...