第 159 题:实现 Promise.retry,成功后 resolve 结果,失败后重试,尝试超过一定次数才真正的 reject
实现 Promise.retry,成功后 resolve 结果,失败后重试,尝试超过一定次数才真正的 reject。
Promise.retry = (fun, limit = 5) => { return new Promise((resolve, reject) => { let __num = 1; let __run = () => { fun() .then(res => { resolve(res); }) .catch(err => { if (__num++ >= limit) { reject(err) } else { console.log('retry again!!') __run() } }) } __run() }) } let k = 0 function test () { return new Promise((resolve, reject) => { if (++k >= 3) { resolve(k) } else { reject('hhh') } }) } Promise.retry(test).then(res => { console.log('resolve: ', res) }).catch(err => { console.log('reject: ', err) }) // retry again!! // retry again!! // resolve: 3
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(42)
比如重试 5 次
实现
对于常见的应用场景,至少应该满足重试次数和每次重试的间隔可配置,失败后立即重试意义并不大。
测试
实现
含最大次数 & 延迟执行
测试
上面大部分有有个问题,不一定try-catch报错了才reject,得到不符合预期的结果也是reject的
应该先count--,不然永远也进不了catch那步啊
弱弱的发一个,
思路:
fn 属于 Promise
while 需要 await 阻塞
递归 可以直接回调 异步
promise里用try cath的你们不觉得诡异的么
更加具有抽象形式的retry,尝试反复执行一个方法,方法内部可以是异步请求,或者其他需要retry的动作,如请求动画等等。所以,我给出的retry函数的ts形式是这样的。
感觉题目可以清晰一些,指定retry的入参是啥
为啥感觉你们写的怎么这么复杂 。。。
再简化一下
我就想问这一句:return fn().then((res) => rs(res));
题目没说fn函数返回的一定是Promise吧?普通函数调用then不就报错了
方法一:在
catch()
中再次执行函数方法二:
async
函数,结合while
循环和try...catch
测试:
写的不好,有好的写法大家可以指点一下,感谢