跳到主要内容

并发请求控制

如何实现并发请求数量控制?

const request = (queue,max) => {
return new Promise((resolve,reject) => {
function exculute (q,len) {
if(!q.length) resolve();
while(q.length && len >0) {
len--;
const task = q.shift();
Promise.resolve(task())
.then(res=> resolve(res))
.catch(err => reject(err))
.finally(()=> {
exculute(q,len++)
})
}
}
exculute(queue,max)
}
}

如何实现串行请求,最大错误三次?

function serialRequest(promises) {
return new Promise((resolve, reject) => {
let index = 0;
function nextRequest() {
if (index >= promises.length) resolve()
const task = promises.shift();
let retryCount = 0;
function attemptRequest() {
Promise.resolve(task())
.then(data => {
index++; // 移动到下一个请求
return nextRequest(); // 继续下一个请求
})
.catch(error => {
retryCount++;
if (retryCount < 3) {
return attemptRequest(); // 重试
} else {
index++; // 即使失败,也移动到下一个请求
return nextRequest(); // 继续下一个请求
}
});
}
return attemptRequest();
}
return nextRequest();
}
}

实现一个支持请求失败后重试的JS方法

function reTry(asyncFunc,times) {
return new Promise(async (resolve, reject) => {
function reTryFunc(times) {
Promise.resolve(asyncFunc())
.then((res) => resolve(res))
.catch((err) => {
if (times > 0) {
reTryFunc(times - 1)
} else {
reject(err)
}
})
}
reTryFunc(times)
})
}