网站首页 > 博客文章 正文
日常开发中会经常遇见在一个模块尤其是可视化模块中多次调用多个api请求数据,而同一时间的大量api请求会造成服务器压力变大,稳定性变差,尤其是用户量很大的时候,这种影响会更突出。处理并发问题,后端一般会合并业务接口减少api调用,我们前端一般会配合进行优化,无非就是根据api优先级依次调用,减少同一时间的api调用。因此封装一个可控并发数的工具函数就比较重要了。
代码如下
//延迟函数
const p = (n)=> {
return new Promise((res)=>{
const t = (Math.random()*4000).toFixed(3)
setTimeout(() => {
console.log('/requestcallback.html [259]--1','t',t);
res({t,n})
},t);
})
}
//使用fetch
//接口请求的函数
async function request(url) {
//模拟各个接口响应时间,延迟执行api
//真实场景中可以注释该代码,或者写死延迟时间,比如50ms
await p(url)
return fetch(url,{
method:'GET'
}).then( async(res)=> {
const data = await res.json()
return {
data: data.data
}
})
}
/**
* handleApiLimit 可控并发请求的函数
* @params urls[] api
* @params limit 并发数量 default 2
* return [...data]
*/
async function handleApiLimit(urls,limit=2) {
let result=[],start=0,end=limit,length=urls.length;
if(limit>length) {
end = length
}
while(start<length-1) {
let apis = [...urls.slice(start,end)].map(api=>request(api))
console.log('/requestcallback.html [323]--1','start,end',start,end);
const res = await Promise.all(apis)
console.log('/requestcallback.html [325]--1','res',res);
start=end
end+=limit
result.push(...res)
}
return result
}
测试apis数量24,打印如下
//urls 因公司业务问题不提供了,自行补充
await handleApiLimit(urls,4)
猜你喜欢
- 2024-10-20 轻量级的React数据流及状态管理解决方案,支持SSR服务器端渲染
- 2024-10-20 5 分钟掌握 JavaScript 实用窍门(javascript官网)
- 2024-10-20 前端必备的20种基本React工具「干货」
- 2024-10-20 async await 并发(async await会阻塞吗)
- 2024-10-20 8 张图帮你一步步看清 async,await 和 promise 的执行顺序
- 2024-10-20 Atom源码阅读系列一(nasm源码阅读笔记)
- 2024-10-20 2019年JavaScript几个秘密窍门,你知道吗?
- 2024-10-20 小猿圈分享6个提JavaScript 小技巧(下)
- 2024-10-20 js遍历那些事儿(js遍历tr)
- 2024-10-20 Google 开源 zx,用 async/await 编写 shell 脚本
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)