当前位置: 首页 > Web前端 > JavaScript

Promise+Async&Await+Array.reduce+function递归解决network-interface

时间:2023-03-27 00:56:46 JavaScript

背景想象一个需要频繁更新数据的场景(例如:监控,图表),常规的方法是设置一个定时器setInterval,时间间隔为N秒;但是这个方法有问题。当前一个请求时间过长(超过间隔)时,后一个请求的接口响应会比前一个请求早,也就是说旧的数据渲染会覆盖新的数据渲染。Promise+Async&Await+Array.reduce+function递归解决网络/接口请求顺序/排队不间断区间访问解决方案利用Array.reduce的迭代特性,注册异步(Async)匿名函数,将网络请求封装到Promise实例等待(await)整个迭代周期中上一个请求完成后才请求下一个请求,完成一个请求周期后递归调用自身,开始新一轮完全相同的请求周期,模拟不间断的顺序网络请求。//模拟网络请求函数simulateRequest(){consttime=1000;returnnewPromise(resolve=>setTimeout(()=>{resolve();console.log(`模拟请求耗时${time}ms`);},time));}//循环序列请求函数cycleRequest(){console.log('新一轮请求');//一个请求周期,这里为了模拟方便长度为10,实际情况可能是10000或者99999constarr=newArray(10).fill(undefined);arr.reduce(async(last,curr,index)=>{awaitlast;returnsimulateRequest().then(()=>{if(index+1===arr.length){//完成一个循环后重复cycleRequest();}}});},undefined);}//开始cycleRequest();结果打印:新一轮开始请求模拟请求spend1000msmockrequestspend1000msmockrequestspend1000msmockrequestspend1000msmockrequestspend1000msmockrequestspend1000msmockrequestspend1000msmockrequestIttakes1000ms...版权所有声明Alloriginal本博客文章版权归作者所有。转载必须包含此声明,保持本文完整,并以超链接的形式注明作者及本文原文地址:https://blog.mazey.net/2317.html(完)