2026/1/24 18:22:58
网站建设
项目流程
跨境浏览网站,广州公司注册核名,汕头网站建设和运营,现在网站建设需要多少钱题目#xff1a;N个并发任务#xff0c;异步执行#xff0c;按照任务的添加顺序返回执行结果#xff0c;而不是谁先执行完返回谁#xff0c;保证并发任务的执行顺序。
给定下面的代码#xff0c;要求实现ConRequests类。
//模拟异步请求
function mockRequest(name, dela…题目N个并发任务异步执行按照任务的添加顺序返回执行结果而不是谁先执行完返回谁保证并发任务的执行顺序。给定下面的代码要求实现ConRequests类。//模拟异步请求functionmockRequest(name,delay){returnnewPromise((resolve){setTimeOut((){resolve(任务{name}完成)},delay)})}constrequestsnewConRequests()constreq1requests.add(mockRequest(A,3000))constreq2requests.add(mockRequest(B,1000))constreq3requests.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.currentIndex0//当前能释放结果的索引}add(promise){returnnewPromise((resolve,reject){//index作用// 保证任务 Aindex0、任务 Bindex1、任务 Cindex2的requests/results下标严格对应// 即使 B 先完成results[1] 结果但results[0]还是nullA 未完成tryRelease会卡在currentIndex0直到 A 完成后才会依次释放 A、B、C。constindexthis.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.currentIndexthis.requests.lengththis.results[this.currentIndex]!null){constresultthis.results[this.currentIndex]const{resolve,reject}this.requests[this.currentIndex]if(resultinstanceofError){reject(result)}else{resolve(result)}this.currentIndex}}}