# 序言
# 题目要求
实现一个maxRequest 成功后resolve结果,失败后重试n次才真正reject。
# 答案解析
/**
* 实现一个maxRequest 成功后resolve结果,失败后重试n次才真正reject。
* @param {function} fn
* @param {number} n
* */
/**
* 返回一个Promise实例,在实例内部声明help函数
* 在里面做一个Promise.resolve立即执行
* 如果正常运行,走then,则结束流程
* 如果报错,走了catch,则提示剩余次数,并减少一次,再次调用help
* */
function maxRequest(fn, maxNum = 3) {
return new Promise((resolve, reject) => {
function help(index) {
// 注意这里传的fn,为执行的fn,为了在then中拿到它的value
Promise.resolve(fn())
.then((value) => {
console.log("ok");
resolve(value);
})
.catch((err) => {
console.log("重试剩余次数:", index);
if (index - 1 > 0) {
help(index);
} else {
reject(err);
}
});
}
help(maxNum);
});
}
function add() {
return 1 + 3;
}
let result = maxRequest(add, 3);
let res =result.then(value=>{
console.log(value); // 4
})
# 思路要点
在Promise实例的内部声明函数,则可以通过这个函数的逻辑,来决定状态走向Fulfilled或者Rejected。
← 项目中的电子签名组件 实现new操作符 →