怎样同时获取10000+接口的返回值:Promise.all高并发限制解决方案
Posted 前端呆头鹅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样同时获取10000+接口的返回值:Promise.all高并发限制解决方案相关的知识,希望对你有一定的参考价值。
Promise.all高并发限制解决方案
怎样同时获取10000+接口的返回值??
有这样一种常见场景,我们希望同时请求N个接口,拿到所有的返回值做处理,这种情况下一般使用Promise.all实现。
let urls = [
'https://.../url1',
……
'https://.../url100'
];
function loadData(url)
return new Promise((resolve, reject) =>
axios.get(url).then((res) =>
resolve(res)
)
)
;
let allList = []
urls.forEach(url => allList.push(loadData(url)))
Promise.all(allList).then((res) =>
console.log(res)
但是如果接口过多,如一次性向后端请求1000个接口,肯定是不行的,那如何优化呢?
首先我们写一个新类promis继承自Promise,用来承载拓展功能。
写一个静态类proAll,该方法将传入的promise数组分批次执行,分批次调用Promise.all函数,在Promise.all函数取到上一批次的结果后,发出下一批次的请求,并依次记录请求结果数据。如遇到请求失败则终止调用。
class promise extends Promise
static proAll = (arr) =>
var i = 0
var resArr = []
function getsliceArr(i)
return arr.slice(i, i+10).map((item)=>
return item() // 此时发出请求
)
function all(sliceArr, res, rej)
promise.all(sliceArr).then(allres =>
console.log(allres)
if(i < arr.length)
resArr.push(...allres)
let sliceArr = getsliceArr(i+=10)
all(sliceArr, res, rej)
else
res(resArr)
, allrej =>
rej(allrej)
)
// 为实现分批次进行promise执行的目的,这里的arr为function数组
return new promise((res, rej) =>
let sliceArr = getsliceArr(i)
all(sliceArr, res, rej)
)
此时promise已经含有Promise的所有功能,并实现了可批次请求的方法proAll。
使用:
let a = () =>
new promise((res)=>
res(1)
)
let b = () =>
new promise((res)=>
res(2)
)
promise.proAll([a, b]).then((res) =>
console.log('res', res)
, (rej) =>
console.log('rej', rej)
)
以上是关于怎样同时获取10000+接口的返回值:Promise.all高并发限制解决方案的主要内容,如果未能解决你的问题,请参考以下文章
使用LoadRunner发送json格式登陆参数后怎样获取登陆验证的token
请问怎样用Java获取股票行情历史数据?新浪、搜狐、百度财经都可以......