前端控制异步请求并发数

65 阅读1分钟
function asyncRequest (requestList, limits, callback) {
  const promiseList = requestList.slice()
  const countLimit = Math.min(limits, promiseList.length)
  // 当前并发数
  let currentCount = 0
  // 能执行的并发请求
  const runTaskStart = () => {
    let i = 0
    while (i < countLimit) {
      i++
      runTask()
    }
  }
  // 取出一个任务并执行
  const runTask = () => {
    const promise = promiseList.shift()
    promise && runer(promise)
  }
  // 执行任务
  const runer = async (promise) => {
    try {
      currentCount++
      // try/catch只能捕获同步错误,不能捕获异步错误
      await promise()
    } catch (error) {
      callback && callback(error)
    } finally {
      currentCount--
      picker()
    }
  }
  // 执行下一个任务
  const picker = () => {
    if (promiseList.length && currentCount < countLimit) {
      runTask()
    } else if (!promiseList.length && currentCount === 0) {
      callback && callback('sss')
    }
  }
  runTaskStart()
}

const list = [
  () => {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log('请求1');
        resolve()
      }, 1000)
    })
  },
  () => {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log('请求2');
        resolve()
      }, 1000)
    })
  },
  () => {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log('请求3');
        resolve()
      }, 1000)
    })
  },
  () => {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log('请求4');
        resolve()
      }, 1000)
    })
  },
  () => {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log('请求5');
        resolve()
      }, 1000)
    })
  }]
asyncRequest(list, 2, (res) => {

  console.log('请求完成', res)

})