Promise解决并发请求和async/await解决并发请求

发布时间 2023-06-09 22:39:30作者: 卿六

有的时候会出现一种情况,就是你需要调用多次API,因为可能调一次返回的数据量过大,占满了带宽就直接卡死,但是你又不想每次只调用一个,想每次调用多个,你就可以尝试下面的方法:

使用Promise解决并发问题


function async concurrentRequests(args, len = 10) {
   const recordArr = 0 // 用来记录当前有多少个请求

  for(let i = 0; i < args.length; i++) {
    const rsp = request(i) // 假设这就是我们的请求
    recordArr++ // 请求数加一
    rsp?.then((res, rej) => {
      if(res?.Status === 'success') { // 假设我们以请求结果的Status判断成功与否
        // 进行正常的业务交流
      }
      recordArr--
    })
    if(recordArr.length === len) { // 到达极限了
      await Promise.race(recordArr) // 等待recordArr的变化
    }
  }
}

使用async/await控制并发请求

async function concurrentRequests(urls, limit = 5) {
  const queue = urls.map(url => fetch(url)) // 将请求放到一个数组队列中

  return new Promise((resolve, reject) => {
    const results = [] // 记录结果数组
    let count = 0 // 记录当前请求量
    const next = async () => {
      if(queue.length > 0) {
        while(queue.length > 0 && count < limit) {
          count++
          const req = queue.shift() // 取出请求
          req().then(res => {
            results.push(result)
          }).catch(err => {
            console.error(err)
          }).finally(() => {
            count-- // 放出
            next()
          })
        }
      } else if(count === 0) {
          resolve(results)
      }
    }
    next()
  })
}