retryit 为thenable的函数增加重试机会


问题


在移动端上,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();
        })
    }
}



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容