重试
function limitCount(url,maxCount){
return fetch(url).catch((err)=>{
maxCount > 0 ? limitCount(url,maxCount - 1) : Promise(reject(err))
})
}
limitCount('https://www.baidu.com/',6).then(res=>{console.log(res)})
.catch(err=>{console.log(err)})
超时
function limitTime(url,maxTime){
return Promise.race([
fetch(url),
new Promise(reject=>{setTiomeout(()=>{console.log('请求超时')},maxTime)})
])
}
limitTime('https://www.baidu.com/',0000).then(res=>console.log(res))
.catch(err=>console.log(err))
并行
function limitRequest(urls,maxNum){
return new Promise(()=>{
let cnt = 0; //记录当前请求数
while(cnt < maxNum){
request();
cnt ++;
}
async function request(){
if(!urls.length) return;
await fetch(urls.shift()).finally(cnt --);
}
})
}
function limitRequest(urls, maxNum) {
return new Promise((resolve) => {
if (urls.length === 0) {
resolve([])
return
}
const results = []
let index = 0
let count = 0
async function request() {
if (index == urls.length) {
return
}
let i = index
const url = urls[index]
console.log(url);
index++
try {
const resp = await fetch(url)
results[i] = resp
}
catch (err) {
results[i] = err
} finally {
count++
if (count == urls.length) {
resolve(results)
}
request()
}
}
const times = Math.min(maxNum, urls.length)
for (let i = 0; i < times; i++) {
request()
}
})
}
// 测试数据
const urls = [];
for (let i = 1; i <= 20; i++) {
urls.push(`https://jsonplaceholder.typicode.com/todos/${i}`)
}
limitRequest(urls, 4).then(res => {
console.log(res)
})