javascript实现并发请求

130 阅读1分钟

javascript实现并发请求

要求

实现一个批量请求函数 multiRequest(urls, maxNum),要求最大并发数 maxNum,每当有一个请求返回,就留下一个空位,可以增加新的请求,所有请求完成后,结果按照 urls 里面的顺序依次打出

代码

const axios = function (url) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(url)
    }, 1000)
  })
}
/** 并发请求
 * @param {Array} urls 请求数组
 * @param {Number} maxNum 并发数
 */
function multiRequest(urls, maxNum) {
  return new Promise(resolve => {
    let count = 0
    const results = []
    while (count < maxNum && urls.length) {
      next()
    }
    async function next() {
      count++
      const currentUrl = urls.shift();
      console.log(`${currentUrl}开始了`)
      const url = await axios(currentUrl)
      console.log(`${url}结束了`)
      count--
      results.push(url)
      if (urls.length) {
        next()
      } else if (!count){
        resolve(results);
      }
    }
  })

}

multiRequest(["/url1","/url2","/url3","/url4","/url5","/url6"], 3).then(res=>{
  console.log(res, 'results');
})

在线查看