问题
在移动端上,ajax都有一定概率由于网络信号瞬间抖动,而导致失败。
,通过这个函数,可以赋予每个ajax重新尝试的机会
未完待续...
解决
export default function(genOptions){
const defaultOptions = {
scope:null,
times:5,
duration:1000,
retryCallback(error, times){},
/**
* 该函数返回存在值,会认为promise仍然失败,同时返回对象会被throw到catch中
* @param successResponse
* @param times
*/
failJudge(successResponse,times){},
}
/**
* function(thenable,options)
* function(thenable,options,args)
* function(thenable,args)
*/
return function(thenable,options,args){
if(Array.isArray(options)) {
args = options;
options = undefined;
}
options = Object.assign({},defaultOptions,genOptions,options);
let counter = 0;
return new Promise((resolve,reject)=>{
function retry(){
thenable.apply(options.scope,args||[])
.then(resp=>{
let judgeResult = options.failJudge(resp,counter);
if(judgeResult) {
throw judgeResult;
}else{
resolve(resp);
}
})
.catch(resp=>{
counter++;
if(options.retryCallback(resp,counter) === false){
return reject({code:-1,message:"被用户中止"});
}
if(counter<options.times) {
setTimeout(retry,options.duration)
}else{
reject(resp)
}
})
;
}
retry();
})
}
}