封装一个并发请求

61 阅读1分钟

封装一个并发请求

// urls:请求url的数组
// 最大并发数
function concurRequest(urls, maxNum){
  return new Promise(resolve=>{
    if(urls.length === 0){
      resolve([])
      return
    }
    const results = []
    let index = 0;
    let count = 0; // 当前请求完成数量

    // 发送请求
    async function request(){
      if(index >= urls.length) return
      const i = index
      const url = urls[index]
      index++
      try {
        const resInfo = await fetch(url)
        const res = await resInfo.json()
        results[i] = res;
      } catch (error) {
        results[i] = error
      }finally{
        count++
        if(count === urls.length){
          resolve(results)
        }
        request()
      }
          
    }
    const times = Math.min(maxNum, urls.length)
    for(let i = 0; i < times; i++){
      request()
    }
  })
}

// 测试上面的方法
const urls = []
for(let i = 1; i < 5; i++){
  urls.push(`http://localhost:2022/api/list/${i}`)
}
concurRequest(urls, 2).then(res=>{
  console.log('res',res);
})

这是通过express编写的一个模拟接口

const express = require('express')
const router = express.Router()

for(let i = 1; i < 20; i++){
  router.get(`/${i}`, (req, res)=>{
    res.send({code: 200, data: i})
  })
}

module.exports = router

开发中图片上传的需求有可能会用上,例如,一次上传十张图片等等