Day354:把任意一个函数,修饰生成一个带重试功能的新函数。
Opened this issue · 1 comments
qappleh commented
1.如果执行失败,进行重试;
2.如果执行成功,直接返回结果;
3.如果重试了N次依然失败,抛出最后一次的异常;
4.新函数的表现形式要尽可能与原函数保持一致。
@param { Function } fn
@param { number } n 最大重试次数
@return { Function } 带有重试功能的新函数
function useRetryable(fn,n){
}
AimWhy commented
// @param { Function } fn
// @param { number } n 最大重试次数
// @return { Function } 带有重试功能的新函数
function useRetryable(fn, n = 0){
let temp = n
function retry(e, args) {
if(n > 0) {
n--
return fnWrap.apply(null, args);
} else {
n = temp
throw e
}
}
function fnWrap(...args) {
try {
let result = fn.apply(null, args);
if (result && result.then) {
let pResult = result.catch(e => {
return retry(e, args)
})
pResult.then(_ => {
n = temp
})
return pResult
} else {
n = temp
return result
}
} catch (e) {
return retry(e, args)
}
}
return fnWrap
}
// var x = useRetryable((a) => {console.log('why', a); throw '出错'}, 4)
window.i = 0
var x = useRetryable((a) => { return new Promise((res, rej) => { console.log('nll'); window.i++; window.i==3 ? res('ok') : rej('chucuo');})}, 5)
x('test')
x('test')
window.i = 0
x('test')