1.首先来个封装获取数据的 Promise方法
function getData(){
let p = new Promise((resolve,reject)=>{
setTimeout(()=>{
// 定义一个随机数
let num = Math.ceil(Math.random()*20)
// 小于这个随机数 那么就是成功 反之就是失败
if ( num <= 20) return resolve(num)
if ( num>20) return reject('失败了 憨憨')
},1000)
})
// 返回出去 p
return p
}
2.有失败重试功能的函数 myGetData()
function myGetData(getData,times,delay){
// 返回一个 Promise对象
return new Promise((resolve,reject)=>{
// 定义重试函数
function again(){
getData().then(resolve).catch(err=>{
console.log(还有 ${times} 次尝试)
if(times ==0){
reject(err)
}else{
times--
setTimeout(again(), delay)
}
})
}
// 调用方法
again()
)}
)
3.// 执行函数,五次重试,每隔一秒执行一次
myGetData(getData,5,1000)
Promise.retry = (fun, limit = 5) => {
return new Promise((resolve, reject) => {
let __num = 1;
let __run = () => {
fun()
.then(res => {
resolve(res);
})
.catch(err => {
if (__num++ >= limit) {
reject(err)
} else {
console.log('retry again!!')
__run()
}
})
}
__run()
})
}
let k = 0
function test () {
return new Promise((resolve, reject) => {
if (++k >= 3) {
resolve(k)
} else {
reject('hhh')
}
})
}
Promise.retry(test).then(res => {
console.log('resolve: ', res)
}).catch(err => {
console.log('reject: ', err)
})
// retry again!!
// retry again!!
// resolve: 3
function execRetry(fn, time) {
function exec() {
new Promise((resolve) => {
fn(resolve);
}).catch((error) => {
console.log('catch 异常')
if (time > 0) {
time -= 1;
exec();
} else {
throw error;
}
});
}
return exec();
}
function tmp(done) {
console.log("执行");
setTimeout(() => {
done();
}, 1000);
throw 'hoho'
}
Most helpful comment