怎样同时获取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高并发限制解决方案的主要内容,如果未能解决你的问题,请参考以下文章

ajax返回为对象,怎样得到对象的属性值

使用LoadRunner发送json格式登陆参数后怎样获取登陆验证的token

请问怎样用Java获取股票行情历史数据?新浪、搜狐、百度财经都可以......

关于微信获取access_token接口,返回值为-1000的问题

VBA 开发从数据库中查询数据,怎样返回一个数组?

js怎样获取onclick的返回值