博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
高阶函数的使用
阅读量:6981 次
发布时间:2019-06-27

本文共 1696 字,大约阅读时间需要 5 分钟。

问题

字节跳动面试时问题:原函数例如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本质上是一个思路。

转载地址:http://amjpl.baihongyu.com/

你可能感兴趣的文章
ROS机器人程序设计(原书第2版)第1章 ROS Hydro系统入门
查看>>
《Android平板电脑开发秘籍》——3.9节技巧:创建一个下拉列表式的ActionBar
查看>>
《软件工程(第4版?修订版)》—第1章1.4节软件工程涉及的人员
查看>>
剖析一个java对象初始化顺序问题
查看>>
《Python和Pygame游戏开发指南》——1.7 安装Pygame
查看>>
reveal.js实现html播放ppt的炫酷效果
查看>>
《HTML5 canvas开发详解(第2版)》——2.12 检查一个点是否在当前路径
查看>>
《深入理解Scala》——第2章,第2.1节学习使用Scala交互模式(REPL)
查看>>
在Tableau中自定义版块地图
查看>>
《黑客秘笈——渗透测试实用指南(第2版)》—第2章2.1节被动信息搜索——开源情报(OSINT)...
查看>>
《21天学通HTML+CSS+JavaScript Web开发(第7版)》——1.7 作业
查看>>
微服务,微架构[一]之springboot[helloWorld]
查看>>
MySql导入CSV文件或制表符分割的文件
查看>>
《机器学习与R语言(原书第2版)》一1.2 机器学习的使用与滥用
查看>>
Android Monkey原理探讨
查看>>
PostgreSQL 10.0 preview 功能增强 - 老板特性, LONG SQL过程可视 pg_stat_progress_vacuum
查看>>
微服务架构是什么
查看>>
AngularJS 自定义服务
查看>>
proxy 动态代理
查看>>
KanaPHP框架介绍
查看>>