题目
字节跳动面试时题目:原函数比方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本质上是一个思绪。