异步异常重试函数

878 阅读1分钟
/**
 * @description 异步重试
 * @param {Function} fn 异步重试
 * @param {number} times 重试次数
 * @param {number} timeout 重试等待时间
*/
function retry(fn, times, timeout = 100) {
  return new Promise((resolve, reject) => {
    const attamp = () => {
      console.log('times %c⧭', 'color: #d90000', times);
      fn().then(res => {
        resolve(res)
      }).catch(err => {
        if (times === 0) {
          reject(err)
          return
        }
        times--
        setTimeout(attamp, timeout)
      })
    }
    attamp()
  })
}

/**
 * @description 模拟请求
*/
function request() {
  let random = Math.random()
  return new Promise((resolve, reject) => {
    if (random > 0.9) {
      console.log('%c⧭', 'color: #0088cc', random);
      resolve({
        code: 200,
        msg: 'success'
      })
    } else {
      console.log('%c⧭', 'color: #917399', random);
      reject({
        code: 500,
        msg: 'error'
      })
    }
  })
}

const res = retry(request, 10, 1000)
console.log(res)