我们经常会遇到某些特殊情况导致请求失败,此时想继续请求,直至请求成功或超过请求次数 . 之前上网查有使用拦截器拦截的方法 . 都是通过 promise 实现为什么不写一个通用的方法呢 ?
很简单 , 失败了再次调用函数即可
function rePromise(PromiseFun, args, times = 0, delay = 0) {
//PrmiseFun是返回Promise实例的函数
//args是PromiseFun的参数数组
//times 重复至多几次请求
//delay 失败到下次请求的间隔
return new Promise(function(resolve, reject) {
let countTimes = 0;
let error = [];
(function nextPromise() {
PromiseFun(...args).then((res) => {
resolve(res);
}).catch((res) => {
error.push(res);
countTimes++ < times ? setTimeout(nextPromise, delay) : reject(error)
})
})()
})
}
但是函数并非十全十美了 , 如果你是使用别人封装的函数 , 那么会出现this隐式丢失 .
比如axios 必须强制绑定this
rePromise(this.$http.post.bind(this.$http),['/grade',{account:xxx}],4)
.then(res=>{
//dosomething
})
.catch(res=>{
//dosomething
})
因为函数内部是使用了 this , 只能手动强制绑定 this ,