Fe-interview: [js] 第436天 写一个方法实现promise失败后自动重试

Created on 24 Jun 2020  ·  3Comments  ·  Source: haizlin/fe-interview

第436天 写一个方法实现promise失败后自动重试

3+1官网

我也要出题

js

Most helpful comment

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

All 3 comments

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'
}
Was this page helpful?
0 / 5 - 0 ratings