很多人都知道JavaScript的闭包,也知道大致是一个什么意思,但是对于闭包的应用场合不是很清楚

最近在改造项目的过程之中修改前端接口轮训方式的时候用到了闭包驱动setTimeout来实现一个类似定时器的功能,可以开启定时器也可以关闭定时器

代码如下

// 创建异步轮训器(setTimeout实现),导出一个闭包对象,用于控制轮训
createLooper (func, time = 1000, params, callback = () => { }, err = () => { }) {
// 轮训时钟
let timer = -1;
// 轮训状态(开启,关闭)
let status = true;
// Promise化的setTimeout
function setTimeoutPromise (func, time, params) {
return new Promise((resolve, reject) => {
timer = setTimeout(async () => {
try {
let result = await func(params);
resolve(result);
}
catch (e) {
reject(e);
}
}, time);
});
}
// 导出的用于控制轮训的闭包对象
const closureObj = {
start () {
if (!status) {
asyncLoop();
status = true;
}
},
stop () {
if (status) {
clearTimeout(timer);
status = false;
}
},
};
// 首次访问,不在轮训体之内的
async function firstCall () {
try {
let result = await func(params);
callback(result, closureObj);
return true;
}
catch (e) {
clearTimeout(timer);
status = false;
console.error(e.message);
err(e, closureObj);
return false;
}
}
// 异步轮训循环
async function asyncLoop () {
let status = await firstCall();
if (status) {
while (true) {
try {
let result = await setTimeoutPromise(func, time, params);
callback(result, closureObj);
}
catch (e) {
clearTimeout(timer);
status = false;
console.error(e.message);
err(e, closureObj);
}
}
}
}
asyncLoop();
return closureObj;
},

这是一个函数,有五个参数

第一个参数为定时器要执行的函数

第二个参数为定时器的触发时间间隔

第三个参数为定时器执行参数的参数

第四个参数为获取执行函数返回值的回调

第五个参数为错误处理的回调

这个函数返回一个对象,这个对象内有两个方法都是闭包导出的方法

分别是start和stop,而这两个方法都访问了函数内部的status(轮训状态)变量以及timer(setTimeout返回的Id),所以可以控制定时器开启和关闭

正是因为闭包的能力所以我们可以调用这个函数返回的对象中的方法来控制函数内部的setTimeout的开启和关闭

这就是我在工作中遇到的闭包的一个小的应用场所

JavaScript闭包应用场合——控制前端接口轮训的更多相关文章

  1. 《Web 前端面试指南》1、JavaScript 闭包深入浅出

    闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...

  2. 我从来不理解JavaScript闭包,直到有人这样向我解释它...

    摘要: 理解JS闭包. 原文:我从来不理解JavaScript闭包,直到有人这样向我解释它... 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 正如标题所述,JavaScript闭包 ...

  3. 理解 JavaScript 闭包

    这是本系列的第 4 篇文章. 作为 JS 初学者,第一次接触闭包的概念是因为写出了类似下面的代码: for (var i = 0; i < helpText.length; i++) { var ...

  4. javascript闭包和作用域链

    最近在学习前端知识,看到javascript闭包这里总是云里雾里.于是翻阅了好多资料记录下来本人对闭包的理解. 首先,什么是闭包?看了各位大牛的定义和描述各式各样,我个人认为最容易一种说法: 外部函数 ...

  5. 最简明的JavaScript闭包解释

    最简明的JavaScript闭包解释 JavaScript是这几年最火的编程语言之一,从前端到服务器端,再到脚本,好像没有一个地方没有JavaScript的身影.这个世界上任何的一种事物的存在必然有其 ...

  6. JavaScript闭包的一些理解

    原文:JavaScript闭包的一些理解 简单一点的说:闭包就是能够读取其他函数内部变量的函数.那如何实现读取其它函数内部变量呢,大家都知道在JavaScript中内部函数可以访问其父函数中的变量,那 ...

  7. 我从来不理解 JavaScript 闭包,直到有人这样向我解释它...

    正如标题所述,JavaScript 闭包对我来说一直有点神秘,看过很多闭包的文章,在工作使用过闭包,有时甚至在项目中使用闭包,但我确实是这是在使用闭包的知识. 最近看国外的一些文章,终于,有人用于一种 ...

  8. javascript闭包—围观大神如何解释闭包

    闭包的概念已经出来很长时间了,网上资源一大把,本着拿来主意的方法来看看. 这一篇文章 学习Javascript闭包(Closure) 是大神阮一峰的博文,作者循序渐进,讲的很透彻.下面一一剖析. 1. ...

  9. javascript闭包的使用--按钮切换

    闭包实现按钮状态切换 看下面的代码: var toggleBtn = document.getElementById('toggle'); var toggleFun = (function() { ...

随机推荐

  1. Python_oneday

    基本程序设计 一切代码输入,请使用英文输入法   编写一个简单的程序 圆公式面积: area = radius * radius * 3.1415   在Python里面不需要定义数据的类型   控制 ...

  2. Python补充4——替换与修改

    最近在自学Python ,在学习过程中发现一个问题,就是Python 的替换与修改. 按照中文思维,替换与修改有什么区别吗?如果发生了部分替换不就是修改了吗?如果修改了不就是新对象替换了老对象吗? 实 ...

  3. 计算机概论 64bit和32bit的CPU的不同

    32位(WOW32).64位(WOW64,x64)指的是两种不同的CPU架构. 32位的CPU能够在每个时钟周期传输32位数据,而64位的CPU能够在每个时钟周期传输64位数据. 32位系统可以访问2 ...

  4. Go的包管理工具(一)

    在前面转载了系列文章:Golang 需要避免踩的 50 个坑,总得来说阅读量都挺大.今天这篇文章,咱们一起聊聊Go的依赖包管理工具. 背景 每一门语言都有其依赖的生态,当我们使用Java语言的时候,使 ...

  5. Google开源项目风格指南

    Google开源项目风格指南 来源 https://github.com/zh-google-styleguide/zh-google-styleguide Google 开源项目风格指南 (中文版) ...

  6. 【opencv 源码剖析】 四、 Mat的赋值构造函数 和 拷贝构造函数

    1.赋值构造函数 右值引用 inline Mat& Mat::operator = (Mat&& m) { if (this == &m) return *this; ...

  7. Ubuntu + Django(DRF) + channels(websocket)+NGINX + uwsgi 环境部署

    原来uwsgi并不能启动  asgi  呀!现在才知道,就因为这一点我花了一周时间才成功啊!!!!!!!! 是呀!你启动uwsgi 是将你的项目启动了,可是你也发现虽然启动了,但是你的websocke ...

  8. 14.SpringMVC核心技术-类型转换器

    类型转换器 在前面的程序中,表单提交的无论是 int 还是 double 类型的请求参数,用于处理该请求 的处理器方法的形参, 均可直接接收到相应类型的相应数据,而非接收到 String 再手工转换. ...

  9. python3 中的cls和self的区别 静态方法和类方法的区别

      一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法. 而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用. 这有利于组织代码,把某 ...

  10. 如何制作 linux 系统 U盘启动盘

    1.制作linux 系统的U盘启动盘,需要选择ISO 模式!给大家推荐几个制作相关软件以及相关制作过程(点击相应名字即可进入到网站):UltraISO.rufus.老毛桃.大白菜. UltraISO ...