前端并发请求

81 阅读1分钟

前端并发请求

/**
 * @param {reqs} 请求数据 [{url,Arguments}]
 * @param {maxNum} 最大并发数
 * 示例:concurReq(reqs,5).then((resps)=>{console.log('打印结果为:',resps)})
*/
concurReq(reqs,maxNum){
  return new Promise((resolve,reject)=>{
    if(reqs.length === 0){
      resolve([]);
      return;
    }
    const results = [];
    let index = 0; //下一个请求的下标
    let count = 0; // 请求完成的数量
    const request = async()=>{
      if(index === reqs.length){ // 如果下标超出范围就停止
        return
      }
      const i = index; // 保存当前请求的下标
      const {url,Arguments} = reqs[index];
      index ++; // 下标自增
      try {
        const result = await AxiosGet(url,Arguments);
        results[i] = result;
      }
      catch(err){
        results[i] = err;
      } finally { // 无论成功或者失败都继续
        count++;
        if(count === reqs.length){
          console.log('ok');
          resolve(results)
        }
        request();
      }
    }
    const times = Math.min(maxNum,reqs.length) // 取最小值
    for(let i=0;i<times;i++){
      request();
    }
  })
}