阅读 64

实现 Promise.retry,成功后resolve,可延迟重试n次,超过n次数后reject

编写node服务时,在调用第三方接口可能会遇到偶尔请求失败的情况,实现个重试机制来增加成功率 含最大次数 & 延迟执行

实现

const isFunction = function(arg{
  return toString.call(arg) === '[object Function]';
};

Promise.retry = (fn, options = {}) => {

  if (!isFunction(fn)) throw new Error('fn is not a function')
  
  const { max = 3, delay = 0 } = options
  let curMax = max
  const delayExec = () => delay && new Promise(resolve => setTimeout(resolve, delay))

  return new Promise(async (resolve, reject) => {
    while (curMax > 0) {
      try {
        const res = await fn()
        resolve(res)
        return
      } catch (error) {
        await delayExec()
        curMax--
        console.warn(`剩余次数${curMax}`)
        if (!curMax) reject(error)
      }
    }
  })
}

复制代码

测试

const resolveData = () => {
  return new Promise((resolve, reject) => {
    setTimeout(
      () => (Math.random() > 0.5 ? resolve('成功') : reject(new Error('失败')))
      , 1000,
    )
  })
}

;(async () => {
  try {
    const res = await Promise.retry(resolveData, { delay1000 })
    console.warn('result', res)
  } catch (error) {
    console.warn(error)
  }
})()

复制代码

欢迎大佬来交流