settimeout()停止_需求方案

settimeout()停止_需求方案转载https://aotu.io/notes/2017/09/25/manage-setTimeout-an-setInterval/在管理setTimeout&setInterval这两个APIs时,笔者通常会在顶级(全局)作用域创建一个叫 timer 的对象,在它下面有两个数组成员——{sto,siv},用它们来分别存储需要管理的setTimeoutID/…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

转载https://aotu.io/notes/2017/09/25/manage-setTimeout-an-setInterval/

在管理 setTimeout & setInterval 这两个 APIs 时,笔者通常会在顶级(全局)作用域创建一个叫 timer 的对象,在它下面有两个数组成员 —— {sto, siv},用它们来分别存储需要管理的 setTimeoutID / setIntervalID。如下:

 

1

2

3

4

 

var timer = {

sto: [],

siv: []

};

在使用 setTimeout / setInterval 的时候,这样调用:

 

1

2

3

4

5

6

7

8

 

// 标记 setTimeoutID

timer.sto.push(

setTimeout(function() {console.log(“3s”)}, 3000);

);

// 标记 setIntervalID

timer.siv.push(

setInterval(function() {console.log(“1s”)}, 1000)

);

 

在页面需要 clearTimeout \ clearInterval 的时候,这样调用:

 

1

2

3

4

 

// 批量清除 setTimeout

timer.sto.forEach(function(sto) {clearTimeout(sto)});

// 批量清除 setInterval

timer.siv.forEach(function(siv) {clearInterval(siv)});

暂停 & 恢复

近段时间,笔者发现很多业务都需要「暂停」和「恢复」setTimeout & setInterval 的功能,而仅靠原生的四个 APIs(setTimeout / setIntervale / clearTimeout / clearInterval)是不够用的。于是,笔者对 timer 进行了扩展,使它具备了「暂停」和「恢复」的功能,如下:

 

1

2

3

4

 

// 暂停所有的 setTimeout & setInterval

timer.pause();

// 恢复所有的 setTimeout & setInterval

timer.resume();

扩展后的 timer对象下面挂载6个基础的 APIs。

  • setTimeout
  • setInterval
  • clearTimeout
  • clearInterval
  • pause
  • resume

使用 timer.set* & timer.clear* 来代替原生的 set* & clear*。笔者把扩展后的 timer 托管在 GitHub 仓库上,有兴趣的同学可以移步:https://github.com/leeenx/timer

CreateJS 的启发

在使用 CreateJS 开发一些项目的过程中,笔者发现通过设置 createjs.Ticker.paused = true / false,可以暂停/恢复 createjs.Tween 上的动画。于是笔者借用 createjs.Tween 模拟了 setTimeout & setInterval 的功能,如下:

 

1

2

3

4

5

6

7

8

 

// setTimeout

createjs.setTimeout = function(fn, delay) {

createjs.Tween.get().wait(delay).call(fn);

}

//setInterval

createjs.setInterval = function(fn, delay) {

createjs.Tween.get().wait(delay).call(fn).loop = 1;

}

 

具体的代码笔者托管在:createjs.timer
其实就是在 createjs 对象下挂载四个 APIs:

  • setTimeout
  • setInterval
  • clearTimeout
  • clearInterval

使用方法与原生的 setTimeout & setInterval 一样,如下:

 

1

2

 

let siv = createjs.setInterval(() => console.log(“1s”), 1000);

createjs.setTimeout(() => createjs.clearInterval(siv), 5000);

 

时间轴驱动的 timer

createjs.timer 在 CreateJS 项目的开发给笔者带来了极大的便利,但是它必须依赖 createjs.Tween 模块。于是笔者就在思考能否创建一个跟第三方框架无关并且又可以在第三方框架上使用的 timer

createjs.Ticker.paused 为什么能暂停 createjs.Tween 上的动画的?
createjs.Tween 中每一个动画都有一条自己的时间轴,这条时间轴是通过 createjs.Ticker 来驱动的;当 createjs.Ticker 被暂停后,createjs.Tween 中的每个动画的时间轴也会失去动力而暂停下来。

createjs.Ticker 的作用是提供一个刷新 canvas 画面帧频,通常是使用 requestAnimationFrame or setInterval 来实现的。如果 timer 内部存在一条时间轴,这条时间轴由第三方驱动,那么 timer 就可以与第三方框架状态同步了。

笔者是这样设计 timer 的结构:

  • queue —— 存放 setTimeout or setInterval 的队列;
  • updateQueue —— 驱动 queue 的内部 API;
  • update —— 外部接口,用于对接第三方 Ticker。

实现的伪代码如下:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

 

/*

@queue 成员的结构如下:

{

fn: fn, // 回调函数

type: “timeout or interval”, // 类型

elapsed: 0, // 时间轴进度

delay: delay // 目标时长

}

*/

let queue = new Map();

function updateQueue(delta) {

queue.forEach((item, id) => {

item.elapsed += delta;

if(item.elapsed >= item.delay) {

item.fn();

// 从 queue 中删除 setTimeout 成员,interval 成员继续循环

item.type === “timeout” ? delete(id) : (item.elapsed = 0);

}

});

}

// 对外接口

this.update = function(delta) {

updateQueue(delta);

}

timer 的具体实现可以参考:https://github.com/leeenx/es6-utils#timer

timer 与 CreateJS 一起使用:

 

1

2

3

4

5

6

 

// es6 代码

import timer from ‘./modules/timer’;

// 统一 ticker

createjs.Ticker.addEventListener(“tick”, function(e) {

e.paused || timer.update(e.delta);

});

 

timer 与 PIXI 一起使用:

 

1

2

3

4

5

6

 

// es6 代码

import timer from ‘./modules/timer’;

// 统一 ticker

app.ticker.add(“tick”, function() {

timer.update(app.ticker.elapsedMS);

});

 

附上 PIXI 的线上 DEMO,二维码如下:

二维码

总结

感谢阅读完本文章的读者。本文仅代表个人观点,希望能帮助到有相关问题的朋友,如果本文有不妥之处请不吝赐教。

感谢您的阅读,本文由 凹凸实验室 版权所有。如若转载,请注明出处:凹凸实验室(https://aotu.io/notes/2017/09/25/manage-setTimeout-an-setInterval/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/186524.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 刷屏专用超长复制_跪求超超长刷屏字符剑。。

    该楼层疑似违规已被系统折叠隐藏此楼查看此楼….飘过…..飘过……飘过…….飘过……..飘过……..飘过……..飘过……..飘过…….飘过……飘过…..飘过….飘过…飘过..飘过.飘过.飘过.飘过..飘过…飘过….飘过…..飘过……飘过…….飘过……..飘过……..飘过….

    2022年4月8日
    94
  • vue怎么关闭eslint_如何关闭eslint

    vue怎么关闭eslint_如何关闭eslint@[TOC]VUE关闭eslint严格模式VUE关闭eslint严格模式如果在使用vue@cli搭建vue工程时,不小心选择了eslint严格校验模式,对于开发人员调试代码是很麻烦的事,那么如何关掉eslint严格模式呢?1.在package.json文件下找到eslint配置”eslintConfig”:{“root”:true,”env”:{“node”:true},”extends”:[“plugin:vu

    2022年10月8日
    0
  • JAVA设计模式之原型模式

    定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。类型:创建类模式类图:原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件:实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在ja

    2022年3月11日
    40
  • Java程序设计(基础)- 方法「建议收藏」

    Java程序设计(基础)- 方法「建议收藏」Java程序设计(基础)- 方法

    2022年4月22日
    43
  • Zynq-Linux移植学习笔记之一-入门[通俗易懂]

    Zynq-Linux移植学习笔记之一-入门[通俗易懂]1、相关网站zynqlinux软件网站:www.wiki.xilinx.comzynqu-bootgithub地址:https://github.com/xilinx 2、启动过程3、u-boot配置3.1下载u-bootUBOOT有多个版本,可以去网站上下载相应的版本。14.5及早期的版本对Micron的QSPIFlash芯片支持不完整。建议下载后期

    2022年9月2日
    3
  • python编手机程序_python程序设计

    python编手机程序_python程序设计手机编程软件有很多,大部分都很难使用,操作不灵活,甚至不能安装第三方库。尝试安装了很多Python移动编程软件,发现了很多问题,不是编码效率低就是各种bug。今天,来自一位python编程小哥指导,向大家推荐两款精心挑选的手机编程软件,它们也是非常成熟的手机编程工具。QPythonOHQpython是一个轻量级的、成熟的python编程工具。它配有终端和简单的代码编辑器。它支持安装第三方库。目…

    2022年8月12日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号