Skip to content

并发请求

在一些场景下面,需要同时发送多条请求,当然,也需要控制并发数,毕竟带宽有限。

思路

js
/**
 * 并发请求
 * @param {*} urls 请求 url 数组
 * @param {*} maxNum  并发请求数量
 */
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++
      console.log(url)
      try {
        const resp = await fetch(url)
        results[i] = resp // 保证返回结果中顺序和请求顺序一致
      } catch (err) {
        results[i] = err // 保证返回结果中顺序和请求顺序一致
      } finally {
        // 判断所有请求是否都已完成
        count++
        if (count === urls.length) {
          // console.log('请求结束', results)
          resolve(results)
        }
        _request()
      }
    }

    const times = Math.min(maxNum, urls.length)
    for (let i = 0; i < times; i++) {
      _request()
    }
  })
}

使用示例:

js
const urls = []
for (let i = 1; i <= 10; i++) {
  urls.push(`https://jsonplaceholder.typicode.com/todos/${i}`)
}
concurRequest(urls, 3).then(resps => {
  console.log(resps)
})

补充

基于 MIT 许可发布