Promise.retry = function (fn, times, delay) {
let leftTimes = times
return new Promise((resolve, reject) => {
async function foo() {
try {
const res = await fn()
resolve(res)
} catch (error) {
if (--leftTimes) {
console.log(`还有${leftTimes}次机会`)
setTimeout(() => {
foo()
}, delay)
} else {
reject(error)
}
}
}
foo()
})
}
function getData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
const random = Math.floor(Math.random() * 10)
if (random < 0) {
resolve(random)
} else {
reject(random)
}
}, 300)
})
}
Promise.retry(getData, 5, 700)
.then(r => {
console.log('成功,结果是', r)
})
.catch(_err => {
console.log('全部执行失败')
})