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

js控制并发请求

一. 设计思路

功能:目的在有限的并发池中运行多个 promise 返回和异步函数。

  1. 添加异步任务
  2. 执行异步任务
  3. 限制最大并发数量

二.实现


interface Fn {(): Promise<any>
}
export default class Pipeline {private list: { // 请求队列fn: Fn,resolve: (value: any) => voidreject: (err: any) => void}[]private count = 0 // 当前并发数量private max = 0 // 最大并发数量constructor (max: number) {this.max = maxthis.count = 0this.list = []}// 添加请求任务add (fn:Fn) {return new Promise((resolve, reject) => {this.list.push({fn,resolve,reject})this.run()})}// 执行任务run () {// 如果当前并发数小于最大并发数量if(this.count < this.max && this.list.length ) {const { fn, resolve, reject } = this.list.shift()!if(fn) {// 每执行一个,当前并发+1this.count++fn().then((res) => {resolve(res)}).catch(err => {reject(err)}).finally (() => {// 每完成一个请求this.count--this.run()}) }}}
}

三. 使用

import Pipeline from "./pipeline"
interface Fn {() : Promise<any>
}
// 创建50个请求
function createRequest () {const arr: Fn[] = []for(let i=0; i < 50; i++) {arr.push(() => new Promise((resolve, reject) => {setTimeout(() => {resolve(i)}, 2 * 2000)})) }return arr
}export async function request() {const pipeline = new Pipeline(1)const arr = createRequest()// 并发执行所有请求const promises = arr.map((fn, index) => {console.log("i", `第${index}个请求`)return pipeline.add(fn).then(res => {console.log("请求结果", res)return res})})// 等待所有请求完成await Promise.all(promises)}
http://www.jsqmd.com/news/53281/

相关文章:

  • Windows Update - Part 2: Update Package - Appendix
  • Azure app service 和 Azure container app 的对比以及技术选型
  • Nestjs框架: 微服务与分布式架构解析之核心概念、应用场景与技术挑战 - 指南
  • 嗯欧哀批2025有机 - Gon
  • GitPulse:让代码的故事自己讲述
  • 图书馆管理系统Alpha阶段Scrum冲刺博客 Day1
  • 工具-一套键鼠控制两台电脑
  • 企业微信HTTP协议调用,逆向开发,本地化部署
  • 20251127周四日记
  • 【第一周:Python 测试开发核心错题集 避坑指南】
  • 空间够造+花钱够省!红旗HS6霸榜家用大五座混动推荐
  • 搜维尔科技:为什么选择Xsens动作捕捉作为人形机器人解决方案?
  • 题解:P13266 [GCJ 2014 Finals] Symmetric Trees
  • python---深拷贝浅拷贝
  • 解决ARM Linux下使用PlatformIO 找不到编译工具链toolchain报错
  • 搜维尔科技:新一代Xsens Link动作捕捉系统,非常适合实时机器人远程操控、虚拟制作和现场演出录制
  • 解决VirtualBox - Error In supR3HardenedWinReSpawn报错
  • 1127随笔
  • 大规模微服务强大的系统中的雪崩故障防治
  • flutter 生命周期管理:从 Widget 到 State 的完整解析 - 指南
  • gradle的各个环境依赖jar包的同一个版本导致的严重后果
  • 20251127
  • Day26字体图标--上传矢量图
  • 从零开始:用Python和Gemini 3四步搭建你自己的AI Agent
  • 双特异性抗体:抗癌 “双面手”,两种模式精准杀伤癌细胞
  • 机器翻译模型跨领域自适应技术解析
  • 高级程序语言第七次作业
  • windows和linux下jar包graalvm打包生native程序 - yebinghuai-qq
  • 2025.11.27
  • 赋能第一期 新员工角色转换主题培训