高阶函数的运用

题目

字节跳动面试时题目:原函数比方fetchData是一个异步函数,尝试从服务器端猎取一些信息并返回一个Promise。写一个新的函数能够自动重试肯定次数,并且在使用上和原函数没有区分。

思绪

这个题目实在不是很难,不过多是太菜了慌张的缘由,当时答得不是很好。不过思绪照样很明白的,内部经由过程闭包来计数,一旦胜利取得数据就返回,不然就继承尝试,直到重试次数到达上限位置。

function retry(fetch, n) {
    let i = 0
    function tryFetch(err) {
        if (i > n) {
            return "reach try limit:" + err
        } else {
            fetch().then(data => {
                return data
            }).catch(err => {
                i ++
                tryFetch(err)
            })
        }
    }
}

当时差不多就是那末答的,有几个题目是,函数挪用体式格局与本来不通,按原理应当返回一个Promise,更正确的说是返回一个返回Promise的函数,如果有什么题目也应当在表面能catch住。另一方面,或许fetch函数要接收参数,也应当通报进去才行。

处理

修改后的函数以下

function retry(fetch, n) {
    return function() {
        let args = arguments
        return new Promise((rseolve, reject) => {
            let i = 0
            tryFetch()
            function tryFetch(err) {
                console.log(i)
                if (i > n) {
                    reject("reach max try" + err)
                } else {
                    fetch(...args).then(data => {
                        rseolve(data)
                    }).catch(err => {
                        i ++
                        tryFetch(err)
                    })
                }
            }
        })
    }
}

末了本身写了个fetch举行测试

function fetch() {
    console.log(arguments)
    return new Promise((rseolve, reject) => {
        console.log('trying...')
        setTimeout(function() {
            if (Math.random() > 0.9) {
                console.log('resolved')
                rseolve('resolved')
            } else {
                console.log('rejected')
                reject('rejected')
            }
        }, 5000)
    })
}

效果相符预期,题目处理。固然也能够返回async function,不过和Promise本质上是一个思绪。

    原文作者:hcfw007
    原文地址: https://segmentfault.com/a/1190000018180662
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞