'use strict';
module.exports = function() {
this.timer = {};
this.config = {};
// 初始化参数
this.init = function(opts) {
var id = opts.id;
this.config[id] = opts;
this.config[id].interval = this.config[id].interval || 1;
this.config[id].begin = opts.begin || 0;
this.config[id].end = opts.end || 0;
this.config[id].step = opts.step || 1;
this.config[id].type = opts.begin < opts.end ? 1 : 0;
this.clear([id]);
this.start(id);
};
// 开启定时器
this.start = function(id) {
var self = this;
var type = this.config[id].type;
var interval = this.config[id].interval;
var step = this.config[id].step;
var cb = this.config[id].callback;
// 先执行一次回调
cb && cb(this.config[id].begin);
type ? this.config[id].begin += step : this.config[id].begin -= step;
this.timer[id] = setInterval(function() {
self.loop(id);
}, interval * 1e3);
};
this.loop = function(id) {
var begin = this.config[id].begin;
var end = this.config[id].end;
var step = this.config[id].step;
var cb = this.config[id].callback;
var endFunc = this.config[id].endFunc;
cb && cb(this.config[id].begin);
if (this.config[id].type) {
if (begin > end) {
this.clear([id]);
endFunc && endFunc();
} else {
this.config[id].begin += step;
}
} else {
if (begin < end) {
this.clear([id]);
endFunc && endFunc();
} else {
this.config[id].begin -= step;
}
}
};
// 更新定时器参数
this.update = function(opts) {
this.config[opts.id] = _.extend({}, this.config[opts.id], opts);
};
// 清除某个(多个或者全部)定时器
this.clear = function(ids) {
var self = this;
if (ids && ids.length) {
_.each(ids, function(id) {
clearInterval(self.timer[id]);
});
} else {
_.each(self.timer, function(v) {
clearInterval(v);
});
}
};
};

参数说明

  • opts.id(String): 定时器id;
  • opts.interval(Number, 单位s, 默认1): 每次轮询时间,比如 1;
  • opts.callback: 回调函数;
  • opts.begin(Number): 起始值;
  • opts.end(Number): 终点值;
  • opts.step 递增/递减数值。
  • opts.endFunc 定时器结束后触发回调(新增)

如何使用

var timer = new Timer();
timer.init({
id: 'count',
begin: 60,
callback: function(count) {
if (count >= 0) {
// do something...
}
},
endFunc: function() {
// do something...
}
});

PS

_.each() 和 _.extend() 是 underscore.js 语法,有关 underscore.js 文档点此查看

【javascript】定时器组件的更多相关文章

  1. C#开发系统服务时用的定时器组件

    写服务时,都需要为定时器写不少的代码,感觉很麻烦,今天把这些代码封装一下,希望能简化一下这方面的工作,把精力都集中在功能上 本定时器组件,每次只启动一个服务实例进行处理,而不会同时多次执行服务代码. ...

  2. Javascript定时器(三)——setTimeout(func, 0)

    setTimeout(func, 0)可以使用在很多地方,拆分循环.模拟事件捕获.页面渲染等 一.setTimeout中的delay参数为0,并不是指马上执行 <script type=&quo ...

  3. Javascript定时器(二)——setTimeout与setInterval

    一.解释说明 1.概述 setTimeout:在指定的延迟时间之后调用一个函数或者执行一个代码片段 setInterval:周期性地调用一个函数(function)或者执行一段代码. 2.语法 set ...

  4. JavaScript定时器详解

    假设有以下场景 setTimeout(function timeoutHandler(){ /*Some timeout handle code that runs for 6ms*/ }, 10); ...

  5. 实验三 CC2530平台上CC2530平台上定时器组件的

    实验三 CC2530平台上CC2530平台上定时器组件的TinyOS编程 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生初步掌握CC2530定时器的PWM功能,及其TinyOS ...

  6. Javascript 定时器调用传递参数的方法

    文章来源:  https://m.jb51.net/article/20880.htm 备注:先记下,以后整理: Javascript 定时器调用传递参数的方法,需要的朋友可以参考下. 无论是wind ...

  7. rt-thread中软件定时器组件超时界限的一点理解

    @2019-01-15 [小记] 对 rt-thread 中的软件定时器组件中超时界限的一点理解 rt_thread_timer_entry(void *parameter)函数中if ((next_ ...

  8. JavaScript定时器的工作原理(翻译)

    JavaScript定时器的工作原理(翻译) 标签(空格分隔): JavaScript定时器 最近在看ajax原理的时候,看到了一篇国外的文章,讲解了JavaScript定时器的工作原理,帮助我很好的 ...

  9. JavaScript定时器作业

    JavaScript定时器作业 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta char ...

  10. 关于JavaScript定时器我的一些小理解

    因为自己在平时工作中,有些功能需要用到定时器,但是定时器并不像我们表边上看到的那样,所以这周末我看看书查查资料,深入研究了一下JavaScript中的定时器,那么废话不多说,下面进入我们今天的正题. ...

随机推荐

  1. php回话控制 cookie

    <?php class CustomCookie{ static private $_instance = null; private function __construct(array $o ...

  2. 潭州课堂25班:Ph201805201 django 项目 第三十一课 在线课堂视频点播的实现(课堂笔记)

    在线课堂 一.数据库模型设计 # 在apps/course/models.py中定义如下模型: from django.db import models from utils.models impor ...

  3. 潭州课堂25班:Ph201805201 django 项目 第二十四课 文章主页 多级评论数据库设计 ,后台代码完成 (课堂笔记)

    加载新闻评论功能 1.分析 业务处理流程: 判断前端传的新闻id是否为空,是否为整数.是否不存在 请求方法:GET url定义:'/news/<int:news_id>' 请求参数:url ...

  4. 多轴APM飞控调参

    调参步骤: 遥控器,电动机和电调对应的APM飞控连线——遥控器校准——电调行程校准——加速度计校准——磁罗盘校准——故障保护设定(遥控器和飞控)——飞行模式设定并调整——自动调参设定选项 APM飞控调 ...

  5. POJ 水题(刷题)进阶

    转载请注明出处:優YoU http://blog.csdn.net/lyy289065406/article/details/6642573 部分解题报告添加新内容,除了原有的"大致题意&q ...

  6. Markdown指南

    Markdown 指南 前几天学习了markdown,然后一直在用,很喜欢这种格式即内容的写作形式.在简书写了几篇,对固定链接的格式很不满意,于是寻找能够支持markdown.固定链接显格式.支持自定 ...

  7. Python 列表(List)-文摘

    原文地址:http://www.runoob.com/python/python-lists.html Python 列表(List) 序列是Python中最基本的数据结构.序列中的每个元素都分配一个 ...

  8. CCNA

  9. 修改Chrome启动参数解决跨域问题

    这个做法仅仅是针对自己本机,只是一个权宜方案 --disable-web-security --user-data-dir=本地用户信息目录 之后启动Chrome浏览器即可

  10. echarts中dataZoom的使用

    ataZoom的使用方法 功能: 1.有inslide和slide两种dataZoom,也分X,Y轴 两种dataZoom的使用 dataZoom:[ { type:"slider" ...