2017年9月29日星期五

管理页面的 setTimeout & setInterval


Linuxeden 开源社区 --cover1

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

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

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

暂停 & 恢复

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

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

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

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

CreateJS 的启发

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

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

  • setTimeout
  • setInterval
  • clearTimeout
  • clearInterval

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

时间轴驱动的 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。

实现的伪代码如下:

timer  的具体实现可以参考:http://ift.tt/2k8wOKF

timer 与 CreateJS 一起使用:

timer 与 PIXI 一起使用:

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

20170925_qr

总结

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

转自 http://ift.tt/2wlRYGH

The post 管理页面的 setTimeout & setInterval appeared first on Linuxeden开源社区.

http://ift.tt/2xLbmjo

没有评论:

发表评论