qappleh/Interview

Day354:把任意一个函数,修饰生成一个带重试功能的新函数。

Opened this issue · 1 comments

1.如果执行失败,进行重试;
2.如果执行成功,直接返回结果;
3.如果重试了N次依然失败,抛出最后一次的异常;
4.新函数的表现形式要尽可能与原函数保持一致。

@param { Function } fn
@param { number } n 最大重试次数
@return { Function } 带有重试功能的新函数
function useRetryable(fn,n){

}
// @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')