案例一:
传入对应的请求数组,并传入限制数limit,表示并发的请求数,只有完成其中的一个请求,才能继续调用下一个,最后返回所有结果。
这个案例比较简单,定义request函数用来执行任务,并发数为3,那么就for循环,同时执行3个任务,当某个任务完成后,再重新调用request()方法
function limitRequest(requestArr: any[], limit: number) {
return new Promise<any>((resolve, reject) => {
const res: any[] = []
//记录需要发送请求的下标
let index = 0
//完成数
let total = 0
//执行函数
function request() {
//每次只要发送请求下标+1,并不是完成后下标+1
const i = index
index++
requestArr[i]
.then(
(value: any) => {
res[i] = value
},
(reason: any) => {
res[i] = reason
},
)
.finally((v) => {
total++
//注意,index只能用来判断目前发送了哪几个请求,但是不能保证请求完成的数量
if (index < requestArr.length) {
request()
}
if (total == requestArr.length) {
resolve(res)
}
})
}
for (let i = 0; i < limit; i++) {
request()
}
})
}
案例二
需求:传入对应的请求数组,并传入限制数limit,表示并发的请求数,如果某个请求失败了,那么limit-1,如果limit==0且还有请求未执行完,那么返回所有失败的结果,不然返回成功的结果。
function limitRequest(requestArr: any[], limit: number) {
return new Promise((resolve, reject) => {
let success: any[] = []
let fail: any[] = []
//表示发起请求的下标
let index = 0
let failCount = 0
let total = 0
function request() {
let i = index
index++
requestArr[i]
.then(
(v: any) => {
success.push(v)
},
(r: any) => {
fail.push(r)
failCount++
if (failCount == limit && total < request.length) {
reject(fail)
}
},
)
.finally(() => {
total++
if (index < requestArr.length) {
request()
}
if (total == requestArr.length) {
resolve(success)
}
})
}
for (let i = 0; i < limit; i++) {
request()
}
})
}