❝编写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, { delay: 1000 })
console.warn('result', res)
} catch (error) {
console.warn(error)
}
})()
欢迎大佬来交流