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

前端js实现按添加顺序返回并发异步任务的执行结果

题目:N个并发任务,异步执行,按照任务的添加顺序返回执行结果,而不是谁先执行完返回谁,保证并发任务的执行顺序。

给定下面的代码,要求实现ConRequests类。

//模拟异步请求functionmockRequest(name,delay){returnnewPromise((resolve)=>{setTimeOut(()=>{resolve(`任务{name}完成`)},delay)})}constrequests=newConRequests()constreq1=requests.add(mockRequest('A',3000))constreq2=requests.add(mockRequest('B',1000))constreq3=requests.add(mockRequest('C',2000))req1.then(console.log)//.then() 接收的是一个函数引用。等价于request1.then(((result)=>console.log(result));req2.then(console.log)req3.then(console.log)//输出://任务A完成//任务B完成//任务C完成

思路:
// 使用一个队列(数组)来记录所有已添加的任务 Promise。
// 维护一个 currentIndex 表示当前应返回第几个结果。
// 每个 Promise 完成后,将其结果存入一个结果数组。
// 一旦前面的结果都已就绪,就按顺序 resolve 对应的包装 Promise。

classConRequests{constructor(){this.requests=[]//存放请求{promise, resolve, reject}this.results=[]//存放执行结果this.currentIndex=0//当前能释放结果的索引}add(promise){returnnewPromise((resolve,reject)=>{//index作用:// 保证任务 A(index=0)、任务 B(index=1)、任务 C(index=2)的requests/results下标严格对应;// 即使 B 先完成(results[1] = 结果),但results[0]还是null(A 未完成),tryRelease会卡在currentIndex=0,直到 A 完成后才会依次释放 A、B、C。constindex=this.requests.lengththis.results[index]=null//占位,避免下标错乱this.requests.push(promise,resolve,reject)promise.then((result)=>{this.results[index]=result//更新结果this.tryRelease()//尝试释放已完成的连续结果}).catch((err)=>{this.results[index]=errthis.tryRelease()})})}tryRelease(){while(this.currentIndex<this.requests.length&&this.results[this.currentIndex]!==null){constresult=this.results[this.currentIndex]const{resolve,reject}=this.requests[this.currentIndex]if(resultinstanceofError){reject(result)}else{resolve(result)}this.currentIndex++}}}
http://www.cnnetsun.cn/news/105668.html

相关文章:

  • AI智能体:完整课程(初级)
  • 震惊!大模型在AIOps中竟有6大“死穴“!小白程序员避坑必看,从工具到智能要素的蜕变之路!
  • GSE宏编译器:魔兽世界玩家的技能循环自动化神器
  • DeeplxFile:突破文件翻译限制的终极解决方案
  • 针对机械设备行业一体化项目制管理解决方案
  • 别再问资质认证怎么查了!看这家公司如何用“大模型搜索”帮客户7天拿下高新认证
  • 【量子编程数据同步新突破】:如何在Q#和Python间无缝传递变量?
  • Java后端开发常见报错及解决方案:小白与大牛的问答故事
  • DeepSeek-V3实战指南:如何精准调优batch_size解决推理性能瓶颈
  • Docker Offload资源释放难题:5个你必须掌握的优化技巧
  • 全面封禁Cursor!又一家大厂,出手了~
  • 为什么你的量子模型总出错?VSCode调试面板告诉你真相
  • 【稀缺技术揭秘】:资深工程师都在用的Azure量子作业状态诊断流程
  • 免费视频增强神器:字节跳动SeedVR2让老视频秒变4K超清画质
  • VSCode Azure QDK 调试失败?(90%开发者都忽略的配置细节)
  • hsweb-framework Easy-ORM终极指南:企业级数据访问实战手册
  • 8、量子计算与技术发展:从理论根源到实际应用
  • 30、RTA API 详解:功能、使用与错误处理
  • 【量子开发效率提升10倍】:VSCode + Azure QDK标准项目模板深度解读
  • ExoPlayer直播优化终极指南:从卡顿诊断到性能提升的完整解决方案
  • 企微SCRM源码分享:源雀SCRM
  • 手把手带你打通Docker Scout+GitHub Actions集成测试全流程
  • 紧急通知:Azure QDK重大版本变更来袭,你的VSCode准备好了吗?
  • 【Azure CLI量子作业资源统计全攻略】:掌握高效资源监控的5大核心命令
  • Docker中调试Vercel AI SDK的3个隐藏技巧,90%开发者都不知道
  • VSCode + Qiskit 环境配置验证全攻略(从零到运行仅需8分钟)
  • 语雀文档备份完整指南:5分钟学会离线文档制作
  • LinearDesign深度解析:5大核心优势助力mRNA序列优化革命
  • Docker Offload任务分配实战精要(附高并发场景调优案例)
  • 窗口置顶功能:打造高效多任务工作环境