请求并发控制器

如题:实现一个并发请求控制函数,可以批量请求数据,并通过一个参数控制请求的并发度,所有请求结束后,调用 callback 回调函数。

var urls = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
var limit = 5

function requestController (urls, limit, callback) {
  let asyncList = []
  const _request = (urls) => {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        // 每次弹出一个请求链接
        const url = urls.shift()
        if (url) {
          console.lg(`当前发送:${url}`)
          resolve(url)
        }
      }, 100)
    }).finally(() => {
      //此处与 limit 相辅相成,每个定时器完成后,到这里又接着启动
      if (urls.length > 0) {
        return _request(urls)
      }
    })
  }
  while (limit--) {
    //此处是关键:通过 limit 来控制一次性启动多少个定时器
    asyncList.push(_request(urls))
  }
  return Promise.all(asyncList).then(callback)
}

requestController(urls, limit, () => {
  console.log(`请求已全部完成!`)
})
Last Updated: 10/27/2019, 9:44:06 AM