Promise + Async&Await + Array.reduce + 函数递归 解决网络/接口请求的依次/排队不间断间隔访问
2021-11-15 10:53
721 查看
背景
试想在一个需要频繁更新数据的场景(例如:监控、图表类),常规方法是设置一个间隔 N 秒的定时器
setInterval;但是这种方式存在一个问题,当前一个请求时间过长时(超过了间隔时间),后一个请求的接口响应会先于前一个请求,也就是说,将导致旧的数据渲染会覆盖新的数据渲染。
解决方案
利用 Array.reduce
的迭代性,注册异步(Async)的匿名函数,在函数内部将网络请求封装成 Promise 实例,在整个迭代周期中等待(Await)前一个请求完成以后再请求后一个请求,完成一个请求周期以后递归调用自己,开启新的一轮一模一样的请求周期,模拟不间断的依次网络请求。
// 模拟网络请求 function simulateRequest () { const time = 1000; return new Promise(resolve => setTimeout(() => { resolve(); console.log(`模拟请求花费 ${time}ms`); }, time)); } // 循环顺序请求 function cycleRequest () { console.log('新的一轮开始请求'); // 一个请求周期,这边为了模拟方便长度为 10,实际情况可能是 10000 或 99999 这样的 const arr = new Array(10).fill(undefined); arr.reduce(async (last, curr, index) => { await last; return simulateRequest() .then(() => { if (index + 1 === arr.length) { // 完成一轮后重复 cycleRequest(); } }); }, undefined); } // 启动 cycleRequest();
结果打印:
新的一轮开始请求 模拟请求花费 1000ms 模拟请求花费 1000ms 模拟请求花费 1000ms 模拟请求花费 1000ms 模拟请求花费 1000ms 模拟请求花费 1000ms ad8 模拟请求花费 1000ms 模拟请求花费 1000ms 模拟请求花费 1000ms 模拟请求花费 1000ms 新的一轮开始请求 模拟请求花费 1000ms 模拟请求花费 1000ms ...
版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者后除和本文原始地址:https://blog.mazey.net/2317.html
(完)
相关文章推荐
- 利用ES6中Promise的用法及 ES7中的async await解决异步函数顺序执行的回调地狱问题
- ReactNative踩坑日志——使用async/await语法解决网络请求的异步导致的指令执行顺序错乱问题
- 通过async await和Promise解决多个ajax异步请求之间存在依赖的情况
- 微信小程序将原始的请求接口方法改为promise 请求! --- es7三次封装 ---async- await
- Window访问Linux共享"您可能没有权限使用网络资源"问题解决
- 巧妙解决问题:&CMFCcodeDlg::RunCommands”创建指向成员的指针。MFC多线程调用要求调用的接口必须是全局函数或静态成员函数
- SQL Server 解决 "无法执行该操作,因为链接服务器 的 OLE DB 访问接口 "SQLNCLI10" 无法启动分布式事务"
- 解决方法:SQL2008 链接服务器 访问接口 "SQLNCLI10" 的架构行集 出错的问题!
- async/await && promise
- HttpClient 通过域名访问请求接口出现java.net.UnknownHostException解决方法
- Chrome浏览器地址栏访问接口url,重复请求问题解决
- 详解koa2学习中使用 async 、await、promise解决异步的问题
- 解决IIS6.0不能启动"不能访问网络位置"深入理解Socket Pooling(套接字池)
- 火狐无法访问本机IIS部署的网站,弹出:此地址使用了一个通常用于网络浏览以外目的的端口.出于安全原因,Firefox 取消了该请求 的解决办法
- dsoframer 注册控件后在某些机器调用部分函数时提示"没有注册接口"的解决办法
- Chrome浏览器地址栏访问接口url,重复请求问题解决
- Java&Android开源库代码剖析】のandroid-async-http(如何设计一个优雅的Android网络请求框架,同...
- ie兼容es6,ie兼容ES6的方法,包括箭头函数,Promise,async,await
- 【WePY小程序框架实战四】-使用async&await异步请求数据
- 安装Office 2003出现"错误代码1606 无法访问网络位置0"的解决方法