很多人都知道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内存相关

    Python内存相关 示例一: v1 = [1, 2, 3] v2 = [1, 2 ,3] v1 = 123 v2 = 123 v1 = "dogfa" v2 = "do ...

  2. C++遍历文件夹

    struct _finddata_t { unsigned attrib; //文件属性 time_t time_create; //文件创建时间 time_t time_access; //文件上一 ...

  3. 在Windows中 , 如何用leakdiag “自动”检测内存泄露 (自动记录日志)

    一.基本用法 在LeakDiag中选择aaa.exe 然后选择Windows Heap Allocator来跟踪heap的使用,按start开始,等一会按log,然后再stop 会在c:\leakdi ...

  4. 使用lodop.js打印控件打印table并分页等

    import {getLodop} from '@/utils/LodopFuncs.js' //打印表格 export default{ // num 打印还是打印预览 conData 对象形式 传 ...

  5. 微信小程序配置动态title

    wx.setNavigationBarTitle({ title: this.dynTitle }) 通过页面路由跳转传参 onload(opt)中的opt接受传过来的title 赋值即可

  6. Nginx安装与配置【转】

    原文:linux之nginx 作者;海燕. 一.nginx Ngix是web服务器,跟apache一样,它可以做动态请求转发.web端负载均衡.反向代理等等: tomcat是应用服务器,当然如果非用逼 ...

  7. 嵌入式安装telnet

    busybox配置 Defined at networking/Config.in:784 Depends on: TELNET Location: -> Networking Utilitie ...

  8. CHD-5.3.6集群上Flume的文件监控

    收集hive的log     hive的运行日志:    /home/hadoop/CDH5.3.6/hive-0.13.1-cdh5.3.6/log/hive.log * memory *hdfs  ...

  9. 前端基础(六):Bootstrap框架

    Bootstrap介绍 Bootstrap是Twitter开源的基于HTML.CSS.JavaScript的前端框架. 它是为实现快速开发Web应用程序而设计的一套前端工具包. 它支持响应式布局,并且 ...

  10. CentOS下更改yum源

    centos下下载工具为yum,对应的源在/etc/yum.repos.d/CentOS-Base.repo文件下,修改其URI中前面的网络地址即可