题目要求

手写一个函数,发送任意多个请求,其中有失败的,重发请求,直到所有的都成功或者超出最大重试的次数,才返回最终的结果。

代码

逻辑在注释里,看注释解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

//总请求函数
function requestAll(urls = [], maxTries = 3) {
return Promise.allSettled(urls.map(url=>singleRequest(url,maxTries)))
}

//外层单个请求定义
function singleRequest(url, maxTries = 3) {
return new Promise((resolve, reject) => {
let requestCount = 0; //计数器
//内部定义循环调用
function _request(url) {
fetch(url).then((res) => {
//接口成功直接返回
const data = res.json();
resolve(data);
}).catch(err => {
//接口失败,但是计数器未超过3
if (requestCount++ <= maxTries) {
console.warn('Request Error,but requestCount is ' + requestCount)
_request(url);
} else {
//当计数器大于3真的失败了
reject(err);
}
})
}
_request(url);
})
}