Why does added catch still not work at all?
function maxRequest(url = ``, times = 3) {
// closure
function autoRetry (url, times) {
console.log('times = ', times);
times--;
return new Promise((resolve, reject) => {
fetch(url).then(value => {
if(value.status === 200) {
console.log(`✅ `, value);
resolve(value);
} else {
throw new Error(`❌ http code error: ${value.status }`);
}
}).catch((err) => {
console.log(`❌ Error`, err);
if (times < 1) {
reject(' over max request times!');
} else {
autoRetry(url, times);
}
});
});
}
return autoRetry(url, times);
}
maxRequest(`https://cdn.xgqfrms.xyz/json/badges.js`)
.then(res => res.json())
.then(json => {
console.log('json =', json);
return json;
}, err => {
console.log('error =', err);
throw new Error(err);
})
.catch(err => console.log(`err =`, err))
.finally(() => {
console.log('whatever close loading...');
});


Your use of the explicit Promise construction antipattern masks the fact that you don't return from your
catchblock. In a retry situation, you create a second-try Promise by callingautoRetry, but you don't do anything with it, so thecatchblock in your call tomaxRequestdoesn't protect you and you wind up with an uncaught rejected Promise.For readability's sake, you might also want to change the variable names, so
timesisn't used for both the outer and inner scope. You might also rephrase this as a much shorterasyncfunction that loops.