zoukankan      html  css  js  c++  java
  • promise retry实现

    retry(pf,{
        times: 3,
        //每次延迟
        delay: 1000,
        //每次延迟增量
        increment: 1000,
        shouldRetry: (err,opts) => {
            //判断是否应该继续
            return true;
        },
        onRetry: (data) => {
            //收集error和次数信息
        }
    })
    .then(data => console.log(data))
    .catch(err => console.log(err));
    
    
    //then链实现
    function retry(promiseGen,opts){
        return promiseGen().catch(err => {
            if(opts.shouldRetry && !opts.shouldRetry(err,opts)) return Promise.reject(err);
            if(opts.times-- < 1) return Promise.reject(err);
            let starter = opts.delay ? delay(opts.delay) : Promise.resolve();
    
            return starter.then((res) => {
                if(opts.onRetry) opts.onRetry({err,times:opts.times});
                opts.delay += opts.increment || 0;
    
                return retry(promiseGen,opts);
            })
        })
    }
    
    //await实现,使用await可以直接在for循环中操作,非常清晰
    async function retry(promiseGen,opts){
        let res,err;
        let errors = [];
        let starter = Promise.resolve();
    
        for(var i=0;i<=opts.times;i++){
            try{
                res = await starter.then(promiseGen);
            }
            catch(e){
                err = e;
            }
    
            if(!err) return Promise.resolve(res);
    
            errors[i] = err;
            err = null;
    
            if(opts.delay) {
                starter = delay(opts.delay);
                opts.delay += opts.increment || 0;
            }
        }
        return Promise.reject({errors,times:i})
    }
    
    function delay(time){
        return new Promise(resolve => setTimeout(resolve, time))
    }

  • 相关阅读:
    Switch
    java 函数 运算符
    java 基本类型
    更新时电话查重
    微信公众平台发送模板消息时连发三遍的最简单解决办法
    Yii2.0 发送邮件时中文附件乱码的问题
    Yii2.0 发送文件
    Yii2.0 请求
    Yii2.0随笔 路由
    yii2.0 在save保存之前的操作(放在模型model文件内)
  • 原文地址:https://www.cnblogs.com/mengff/p/12884432.html
Copyright © 2011-2022 走看看