首页 > 其他分享 >Promise解决并发请求和async/await解决并发请求

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

时间:2023-06-09 22:44:51浏览次数:41  
标签:count recordArr const 请求 await 并发 Promise async

有的时候会出现一种情况,就是你需要调用多次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()
  })
}

标签:count,recordArr,const,请求,await,并发,Promise,async
From: https://www.cnblogs.com/taosifan/p/17470409.html

相关文章

  • 大家都说Java有三种创建线程的方式!并发编程中的惊天骗局!
    在Java中,创建线程是一项非常重要的任务。线程是一种轻量级的子进程,可以并行执行,使得程序的执行效率得到提高。Java提供了多种方式来创建线程,但许多人都认为Java有三种创建线程的方式,它们分别是继承Thread类、实现Runnable接口和使用线程池。但是,你们知道吗?其实在创建线程的过程中......
  • Java并发编程 interrupt()方法
    interrupt()用法打断正常运行的线程interrrupt()方法可以用来打断正在运行的线程,也可以打断sleep()、wait()、join()情况下的线程,但是这些情况下被打断线程的打断标记不同。importlombok.extern.slf4j.Slf4j;importjava.util.concurrent.TimeUnit;@Slf4jpublicclassIn......
  • #Vue-cli 5 怎么打印代理地址 #Vue-cli 5 怎么查看真是请求地址 ?
    proxy:{'/api':{target:'http://192.168.3.47:1228',changeOrigin:true,onProxyReq:function(proxyReq,req,res){console.log('[proxy]:'+proxyReq.getHeader('origin')+proxyReq.p......
  • Python 协程池,异步IO非阻塞式,http 请求
    先写个FlaskdemoimporttimefromflaskimportFlaskapp=Flask(__name__)@app.route('/<id>')defhello(id):time.sleep(2)return'Hello,World!:%s'%idif__name__=='__main__':app.run()协程请求import......
  • docker 安装 es-head 以及Content-Type header请求头错误解决
    拉取es-head镜像,启动dockerpullmobz/elasticsearch-head:5dockerrun-itd--namees-head-p9100:9100mobz/elasticsearch-head:5使用上面的镜像启动会有Content-Typeheader请求头错误的问题,可以进入容器中修改js文件,文章最后有提及,也可编写dockerfile重做镜像,避免......
  • jmeter-http请求中post请求
    1、选择取样器-http请求,填写完整web服务器信息、http请求选择post、路径写请求路径(注意从/开始)2、2.1post请求数据为map格式(键值对),直接将键值对添加到参数表中即可 2.2post请求数据为json格式,将json格式的请求数据加到bodydata中,在请求头文件中添加Content-Type的值为appli......
  • HTTP请求中GET请求为何有长度限制?
    HTTP协议并没有规定GET请求URL的长度限制,但是实际上在使用中会存在长度限制。造成GET请求URL长度限制的原因主要有以下两点:浏览器限制。不同的浏览器对URL长度的限制不同,一般来说,在地址栏中输入的URL长度范围在2,000个字符左右,超过这个长度可能会被浏览器截断。......
  • 程序员必备系列:并发工具篇
    不管是为了面试,还是应对工作,并发编程工具是必须掌握的。其实,很多人也看过不少文章,但始终没有掌握,又加上工作中基本上没有用过,所以这一块都还处于知识盲区。希望通过本文让你真正的掌握(会使用大量的生活案列来讲述)。在本场Chat中,会讲到到以下内容:1.信号量能被FixedThreadPool替......
  • javaWeb核心02-Request&Response -(乱码处理、字符流、字节流、虚拟目录、请求转发、重
    文章目录Request&Response1,Request和Response的概述2,Request对象2.1Request继承体系2.2Request获取请求数据2.2.1获取请求行数据2.2.2获取请求头数据2.2.3获取请求体数据2.2.4获取请求参数的通用方式基于上述理论,request对象为我们提供了如下方法:★代码演示2.3IDEA快速创......
  • [ASP.NET Core] 请求大小限制(转载)
    请求大小一般在文件上传的时候会用到,当然也防止传过来的参数过大情况。一、设置请求体的最大值如果不设置请求体大小默认是 30_000_000bytes,大约28.6MB,当超出大小时会出现如下错误:错误:Failedtoreadtherequestform.Requestbodytoolarge.Themaxrequestbodysize......