jspromise原理(JavaScript使用promise处理多重复请求)
jspromise原理
JavaScript使用promise处理多重复请求一、为什么要写这个文章?处理重复请求的文章想必大家也看过了很多,大多数都是分为在response返回之前发现重复请求就return掉的和使用节流/防抖来间接规避用户频繁操作两种版本的。最近在使用的过程的中,发现这两个版本在某些场景下还是有些局限性。
如图,我这个h5的页面,顶部和底部都要显示这个名片组件。这些名片的信息是通过一个接口来获取的,当这个组件在当前页面被初始化时,就会发生两次重复的请求。
这时会面临几个抉择:
1. 不对重复请求做任何处理。
- 缺点1:造成不必要的资源浪费,增大服务器的压力
- 缺点2:http请求在浏览器中是有并发数限制的,如果页面首屏的请求较多且没有分层级加载的话,很容易造成请求阻塞,影响用户第一时间看到主要内容
2. 对重复请求直接return掉。这也是部分文章的做法,不过这种做法有种局限性,就是直接认定后面的重复请求均为无效请求。
- 无效请求场景:用户点击了某个按钮进行查询或保存,在请求结果返回之前,后面点击基本都算是无效请求,这种请求就是应该被阻止的。当然,也可以通过在按钮上添加节流/防抖来规避这个问题
- 为何不适用于目前场景:这两个名片的组件都是需要数据来渲染的,如果第二次重复的请求被return了,其中一个组件的名片就会没有数据。
3. 把请求从组件中抽离出来放到父级的业务页面中,再以props的方式传进组件。
- 好处:只需要请求一次,两个组件就可以共享一份数据。
- 局限性:只适用于单个业务页面用到的情况。事实上这个组件很多个业务页面在用,即使把请求的函数抽成公用的api,也是要在每个业务页面初始化的时候调用一次,然后再以props的方式传进组件。
核心思想
- 初始化一个handleList的数组
- 在请求发送前,根据入参是否相同判断是否为重复请求
- 非重复请求:把改请求的参数和请求返回的Promise添加至数组中
- 重复请求:使用find查找直接返回对应的Promise
- 请求完成后把handleList中之前添加的请求信息移除。
这个方案是什么都可以使用的,无论是使用axios、jq、fetch、小程序request。这里就写实现的原理,使用时直接把对应的代码放到对应的请求时机即可。
代码示例
let handleList = [] // 请求列表 /** * 模拟请求 * @author waldon * @date 2020/6/9 */ const httpRequest = () => { return new Promise((resolve) => { setTimeout(() => { resolve(`请求成功,时间戳为:${new Date().getTime()}`) }, 1000) }) } /** * 请求的相关处理 * @author waldon * @date 2020/6/9 * @param {String} url - * @param {Object} requestObj - 请求参数 * @returns {Promise} - 请求的promise */ function requestTest(url, requestObj = {}) { // 因为入参一般不会涉及到复杂类型,JSON.stri.jpg" alt="jspromise原理(JavaScript使用promise处理多重复请求)" border="0" />
输出结果
存在重复请求,直接返回
存在重复请求,直接返回
首次请求结果 请求成功,时间戳为:1621650375540
handleList: [
{
url: '/ajax/sameUrl',
requestObj: { name: 'waldon' },
handle: Promise { '请求成功,时间戳为:1621650375540' }
}
]
重复请求结果 请求成功,时间戳为:1621650375540
handleList: [
{
url: '/ajax/sameUrl',
requestObj: { name: 'waldon' },
handle: Promise { '请求成功,时间戳为:1621650375540' }
}
]
重复请求结果 请求成功,时间戳为:1621650375540
handleList: [
{
url: '/ajax/sameUrl',
requestObj: { name: 'waldon' },
handle: Promise { '请求成功,时间戳为:1621650375540' }
}
]
请求完成后的handleList: []
代码地址 codepen
https://codepen.io/waldonUB/pen/ZEeeONM
注意的点
- 不要对response中的数据进行增删操作。因为重复请求返回Promise中的对象引用地址都是同一个,改动了就会造成数据污染。特殊情况时可以浅拷贝响应结果再处理,或者是增加对应的断言。
- 处理重复的请求时,最好在log中提示一下,同时在组件中注释好原因和使用场景,避免他人误改
- 做好极端情况下,请求失败的处理,设置有效时间置空和移除请求信息,避免因为闭包堆积过多无用的请求信息造成内存泄漏。
到此这篇关于JavaScript使用promise处理多重复请求的文章就介绍到这了,更多相关js promise多重复请求内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
- js数组的sort排序
- js使用递归解析(关于JavaScript递归经典案例题详析)
- Extjs中FieldSet的收缩和展开
- js 原生事件代理(如何利用原生JS实现触摸滑动监听事件)
- js基础入门运算符(js 可选链操作符的使用)
- php入门教程源代码修改教程(php+js实现的无刷新下载文件功能示例)
- nodejssocket文件传输(node+socket实现简易聊天室功能)
- vuejs组件使用教程交流(Vue vee-validate插件的简单使用)
- js开发工具图解(浅谈前端JS沙箱实现的几种方式)
- js弹出新窗口被拦截的解决方法
- html5和css3最新特性(html5中使用hotcss.js实现手机端自适配的方法)
- extjs xtype的使用
- node.js怎么使用import(Node.js断点续传的实现)
- js怎么防抖(JS防抖节流函数的实现与使用场景)
- js如何解决iphone异形屏适配(Html5适配iphoneX刘海屏的简单实现)
- js的逻辑关系和思路(js Proxy的原理详解)
- 毛戈平全国第一柜花落银泰 高端国货迎来 高光 时刻(毛戈平全国第一柜花落银泰)
- 14岁丧父 20岁丧母,从苦难走向辉煌的银泰创始人沈国军(14岁丧父20岁丧母从苦难走向辉煌的银泰创始人沈国军)
- 银泰集团董事长沈国军获评 北京影响力 十大企业家(银泰集团董事长沈国军获评)
- 15帅气男士发型,清爽时尚很有型,喜欢就试试(清爽时尚很有型)
- 哪几个历史人物被影协主席李雪健演的活灵活现(哪几个历史人物被影协主席李雪健演的活灵活现)
- 王伦狭隘,晁盖霸道,宋江奸诈骨头软,只有鲁智深才适合当寨主(王伦狭隘晁盖霸道)
热门推荐
- 浏览器加载网页的顺序
- 完整版sqlserver2019卸载教程(Sql Server 2012完全卸载方法 只需8步轻松卸载)
- mysql中查询数据合并(Mysql合并结果接横向拼接字段的实现步骤)
- html5 canvas绘图(使用html5 canvas绘制圆环动效)
- js基础入门运算符(js 可选链操作符的使用)
- 阿里云服务器ecs怎么设置(如何解决阿里云ECS服务器误开启了防火墙导致远程连接不上的问题)
- javascript五大继承方式(原生Javascript实现继承方式及其优缺点详解)
- mysql实现mvc(mysql的MVCC多版本并发控制的实现)
- pythonzipfile的用法(对Python之gzip文件读写的方法详解)
- tomcat解决乱码(解决tomcat 静态页面html中文乱码的解决终极篇)