js限制并发请求数

108 阅读1分钟

案例一:

传入对应的请求数组,并传入限制数limit,表示并发的请求数,只有完成其中的一个请求,才能继续调用下一个,最后返回所有结果。

这个案例比较简单,定义request函数用来执行任务,并发数为3,那么就for循环,同时执行3个任务,当某个任务完成后,再重新调用request()方法

function limitRequest(requestArr: any[], limit: number) {
  return new Promise<any>((resolve, reject) => {
    const res: any[] = []
    //记录需要发送请求的下标
    let index = 0
    //完成数
    let total = 0
    //执行函数
    function request() {
      //每次只要发送请求下标+1,并不是完成后下标+1
      const i = index
      index++
      requestArr[i]
        .then(
          (value: any) => {
            res[i] = value
          },
          (reason: any) => {
            res[i] = reason
          },
        )
        .finally((v) => {
          total++
          //注意,index只能用来判断目前发送了哪几个请求,但是不能保证请求完成的数量
          if (index < requestArr.length) {
            request()
          }
          if (total == requestArr.length) {
            resolve(res)
          }
        })
    }
    for (let i = 0; i < limit; i++) {
      request()
    }
  })
}
​

案例二

需求:传入对应的请求数组,并传入限制数limit,表示并发的请求数,如果某个请求失败了,那么limit-1,如果limit==0且还有请求未执行完,那么返回所有失败的结果,不然返回成功的结果。

function limitRequest(requestArr: any[], limit: number) {
  return new Promise((resolve, reject) => {
    let success: any[] = []
    let fail: any[] = []
    //表示发起请求的下标
    let index = 0
    let failCount = 0
    let total = 0
    function request() {
      let i = index
      index++
      requestArr[i]
        .then(
          (v: any) => {
            success.push(v)
          },
          (r: any) => {
            fail.push(r)
            failCount++
            if (failCount == limit && total < request.length) {
              reject(fail)
            }
          },
        )
        .finally(() => {
          total++
          if (index < requestArr.length) {
            request()
          }
          if (total == requestArr.length) {
            resolve(success)
          }
        })
    }
    for (let i = 0; i < limit; i++) {
      request()
    }
  })
}