当前位置: 首页 > news >正文

用Promise实现前端并发请求

/**
* 构造假请求
*/
async function request(url) {return new Promise((resolve) => {setTimeout(() => {resolve(url);},// Math.random() * 500 + 800,1000,);});
}

请求一次,查看耗时,预计应该是1s:

async function requestOnce() {const t1 = Date.now();const res = await request(1);console.log('一次请求耗时=', Date.now() - t1, 'ms,请求结果=', res);
}
requestOnce();

结果:在这里插入图片描述

12个数据发起并行请求,预计耗时1s:

async function requestAsync() {const t2 = Date.now();const requests = new Array(12).fill(2).map(request);const res2 = await Promise.all(requests);console.log('批量请求耗时=', Date.now() - t2, 'ms,请求结果=', res2, ',预计是 1000 ms');
}requestAsync();

结果:
在这里插入图片描述

12个请求并发进行,但限制最多3个请求可并发,预计耗时4s:

async function concurrencyRequest(urls, maxNum) {const buffer = [];//并发请求池,最多有maxNum个const t3 = Date.now();const res = [];for (let i = 0; i < urls.length && buffer.length < maxNum; ++i) {// console.log('next=', i);const promise = new Promise((resolve) => request(urls[i]).then(resolve));buffer.push(promise);promise.then((response) => (res[i] = response)).finally(() => {//每个请求完成后都从buffer中删除并保存响应const index = buffer.findIndex((item) => item === promise);buffer.splice(index, 1);// console.log('删除一个promise', buffer.length);});if (buffer.length === maxNum) {//必须等待buffer size小于maxNum才能继续请求await Promise.race(buffer);}}await Promise.all(buffer);//需要等待最后剩下的几个请求完成才算完成console.log('并发请求耗时=', Date.now() - t3, '请求结果=', res, '预计时间是 4000 ms');
}concurrencyRequest(new Array(12).fill(1).map((_, i) => i + 1),3,
);

在这里插入图片描述

相关文章:

  • 老古董Lisp实用主义入门教程(12):白日梦先生的白日梦
  • C++11标准模板(STL)- 常用数学函数 - 计算一个数的给定次幂 (xy)(std::pow, std::powf, std::powl)
  • Autosar EcuM学习笔记-上电初始化执行函数及下电前执行函数
  • 逆变器控制技术
  • 数据结构与算法——Java实现 24.中缀表达式转后缀
  • Python | 第八章 | 数据容器
  • 爬虫入门 Selenium使用
  • 906. 超级回文数
  • 算法复杂度-空间
  • JAVA红娘婚恋相亲交友系统源码全面解析
  • Java语法-类和对象之抽象类和接口
  • 【软件测试】详解软件测试中的测试级别
  • Stable Diffusion 优秀博客转载
  • Spark 中 任务集 TaskSet 详解
  • 青动CRM V3.2.1
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • co.js - 让异步代码同步化
  • co模块的前端实现
  • golang中接口赋值与方法集
  • Phpstorm怎样批量删除空行?
  • tab.js分享及浏览器兼容性问题汇总
  • text-decoration与color属性
  • 程序员最讨厌的9句话,你可有补充?
  • 创建一种深思熟虑的文化
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 规范化安全开发 KOA 手脚架
  • 技术发展面试
  • 技术胖1-4季视频复习— (看视频笔记)
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 我与Jetbrains的这些年
  • 一道面试题引发的“血案”
  • 用Canvas画一棵二叉树
  • 责任链模式的两种实现
  • 怎么把视频里的音乐提取出来
  • ​​​【收录 Hello 算法】9.4 小结
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #pragma multi_compile #pragma shader_feature
  • #Spring-boot高级
  • #Z2294. 打印树的直径
  • #微信小程序(布局、渲染层基础知识)
  • $nextTick的使用场景介绍
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (第30天)二叉树阶段总结
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (学习日记)2024.01.19
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)nsfocus-绿盟科技笔试题目
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转)用.Net的File控件上传文件的解决方案
  • (转载)(官方)UE4--图像编程----着色器开发
  • (状压dp)uva 10817 Headmaster's Headache
  • .FileZilla的使用和主动模式被动模式介绍