资讯专栏INFORMATION COLUMN

计时器统一管理

darkerXi / 2719人阅读

摘要:计时器统一管理,写法该计时器标识符回调函数时间间隔,单位为秒回调函数参数初始化状态遍历计时器队列计算间隔时间参数获取插入队列清除计时器删除队列项清除队列调用清除清除所有计时器用实现,可以改用链接

计时器统一管理,es6 class写法

let PRIVSTATE;//key for setInterval
class Timer  {
  /*
   * key construct
   * {
   *   key:String//该计时器标识符
   *   call:fn,//回调函数
   *   delay:Num,//时间间隔,单位为秒
   *   params:[]//回调函数参数
   * }
   */
  static keys = [];
  //初始化状态interval-key
  // static PRIVSTATE = null;
  static init() {
      if (!PRIVSTATE && this.keys.length) {
        PRIVSTATE = window.setInterval(() => {
          this.keys.map(item => {//遍历计时器队列
            if (item) {
              let {
                call,
                delay,
                params
              } = item;
              delay = delay ? parseInt(delay) : 1;
              if(!item.delay_count){
                item.delay_count = delay;
              }
              item.delay_count--;
              if (item.delay_count <= 0) {//计算间隔时间
                item.delay_count = delay;
                  if (params && params.length) {
                    call && call(...params);
                  } else {
                    call && call();
                  }
              }
            }
          })
        }, 1000);
      }
    };
    static setIn(...rest) {
      let callObj = {};
      for(var o of rest){//参数获取
        switch (Object.prototype.toString.call(o)) {
          case "[object Array]":
            callObj.params = o;
            break;
          case "[object String]":
            callObj.key = o;
            break;
          case "[object Number]":
            callObj.delay = o;
            break;
          case "[object Function]":
            callObj.call = o;
            break;
          default:
            console.log("noValide param")
            break;
        }
      }
      if(callObj.call){
        if(!callObj.key){
          console.log(callObj.call.name);
          callObj.key = callObj.call.name;
        }
        let itemIn = this.keys.findIndex(item => item.key && item.key === callObj.key);
        if (itemIn >= 0) {//插入队列
          this.keys[itemIn] = callObj;
        } else {
          this.keys.push(callObj);
        }
        this.init();
      }

    };
    static cleanIn(key) {//String//清除计时器
      if (key) {
        let itemIn = this.keys.findIndex(item => item.key && item.key === key);
        if (itemIn >= 0) {
          this.keys.splice(itemIn, 1);//删除队列项
        } else {
          console.error("no Key");
        }
      }else{
        //TODO clean All
        this.keys = [];//清除队列
      }
      if (!this.keys.length && PRIVSTATE) {
        window.clearInterval(PRIVSTATE);
        PRIVSTATE = null;
      }
    }
};
export default Timer;

调用

import timer from "./timer.js"
timer.setIn(handleFn,2,"timeSet")
timer.cleanIn("timeSet")//清除timeSet
timer.cleanIn()//清除所有计时器

用setinterval实现,可以改用requestAnimationFrame
git链接https://github.com/xiaolu0018...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/110311.html

相关文章

  • 时器在大型web项目中的应用和实现

    摘要:在软件项目中,定时器也被应用到了各方各面,本文将从项目入手,讲述定时器,本文的例子都以为例。定时器总类定时器有两种对应重复任务和一次性任务。 在大规模分布式系统中,每个业务都可能是集群,每个业务机都会产生定时任务,不同的业务会有不同的任务管理需求,统一的任务调度和管理变得非常有必要。 定时如何准确,大量的定时被同时触发怎么办? 定时结束的时候,怎么通知业务机去处理呢? 某台业务机下线...

    douzifly 评论0 收藏0
  • 时器在大型web项目中的应用和实现

    摘要:在软件项目中,定时器也被应用到了各方各面,本文将从项目入手,讲述定时器,本文的例子都以为例。定时器总类定时器有两种对应重复任务和一次性任务。 在大规模分布式系统中,每个业务都可能是集群,每个业务机都会产生定时任务,不同的业务会有不同的任务管理需求,统一的任务调度和管理变得非常有必要。 定时如何准确,大量的定时被同时触发怎么办? 定时结束的时候,怎么通知业务机去处理呢? 某台业务机下线...

    whataa 评论0 收藏0
  • 论性能测试

    摘要:吞吐量一般结合业务需求而定服务器资源占用占用率内存使用率命中率篇是一种预测系统行为和性能的负载测试工具。负载测试与压力测试都是性能测试。通过平台接口可进行合理的性能测试。有利于测试人员及时定位问题。 Part 1:性能测试 性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。 A. 类别 性能测试包括负载测试、压力测试、基准测试等。 i. 负...

    qpal 评论0 收藏0
  • [译]新的高性能计算框架——KernelHive

    摘要:追踪正在进行的计算的状态。为了知道作业的进度,通过监听端口来接受二进制文件发来的信息。子系统监听的子系统包括多种预编译二进制文件。这些二进制文件被分配给对应的在应用层定义好的计算模版。 KernelHive: a new workflow-based framework for multilevel high performance computing using clusters a...

    2shou 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<