• 异步方法(promise版)出错自调用


             /**
             * [*promisePlus promise封装的异步,既然是异步,必然会成功或者失败,理论上失败了就失败了,但是    
             * 失败后能否让他过多长时间自动再调用自己呢,如果调用指定的次数还是失败,那就返回一个数组,数组
             * 里面存的是每次接口失败的信息,如果能够一次成功那就更好。]
             * @param {[type]} promise       [promise版的函数或者promise实例]
             * @param {[type]} count         [调用promise版的函数的次数]
             * 注意: 此函数需要配合co模块使用
             */
            var promisePlus = function(promise, count) {
                var cxt = this,
                    args = Array.prototype.slice.call(arguments, 2);
    
                return function* () {
                    var c = 0, message = [], power = 0;
                    if (!isPromise(promise) && typeof promise !== 'function') return;
                    if (typeof promise === 'function') promise = promise.apply(cxt, args);
                    while (true) {
                        ++ power;
                        let t = Math.pow(2, power);
                        if (c ++ >= count) return Promise.reject(new Error(message));
                        try {
                            return yield promise;
                        } catch(err) {
                            message.push(err);
                            console.log('错误次数: ', c, ' 下一次等待时间(单位秒): ', t);
                            yield sleep(t * 1000);
                        };
                    };
                };
    
                function sleep(time) {
                    return new Promise((resolve)=>{
                        setTimeout(resolve, time || 1000);
                    });
                };
    
                function isPromise(obj) {
                    return 'function' == typeof obj.then;
                };
            };

    使用姿势:

            // 超时版的fetch
            function _fetch(fetch, timeout) {
                return Promise.race([
                    fetch,
                    new Promise(function (resolve, reject) {
                        setTimeout(() => reject(new Error('request timeout')), timeout);
                    })
                ]);
            };
    
            function getJSON(url) {
                return new Promise((resolve, reject) => {
                    _fetch(fetch(url), 1000*60).then((info)=> {
                        return info.text();
                    }).then((info)=> {
                        // console.log('结果');
                        resolve(info);
                    }).catch((err)=> {
                        // console.log('出错错错啦');
                        reject(new Error(err));    
                    });
                });
            };
    
            var url = 'http://121.10.140.1233:8080/getRoomDetail?platID=2&roomID=1786565&startDate=2017-06-18&endDate=2017-07-19';
            function getToken() {
                // var url = 'http://121.10.140.123:8080/getRoomDetail?platID=2&roomID=1786565&startDate=2017-06-18&endDate=2017-07-19';
                // var url = 'http://121.10.140.1233:8080/getRoomDetail?platID=2&roomID=1786565&startDate=2017-06-18&endDate=2017-07-19';
                return getJSON(url);
            };
    
    
            function sureAdsList() {
                // var url = 'http://121.10.140.123:8080/getXiaoHuLuIndex?startDate=2017-07-11&endDate=2017-07-19&urlID=1786565&platID=2';
                var url = 'http://121.10.140.123:8080/getXiaoHuLuIndex?startDate=2017-07-11&endDate=2017-07-19&urlID=1786565&platID=2';
                return getJSON(url);
            };
    
            setTimeout(()=>{
                // url = 'http://121.10.140.123:8080/getRoomDetail?platID=2&roomID=1786565&startDate=2017-06-18&endDate=2017-07-19';
            }, 3000);
    
            // 以上都是准备环境,使用就是这样的(需要引入co模块)
            co(promisePlus(getToken, 5)).then((ret)=>{
                console.log(ret);
            }).catch((err)=>{
                console.log(err);
            });
  • 相关阅读:
    PHP基础学习笔记(一)
    安装wampserver之后,浏览器中输入localhost页面显示IIS7解决办法
    HTML5常识总结(一)
    AngularJs中的服务
    AngularJs中的directives(指令part1)
    Happy Number——LeetCode
    Binary Tree Zigzag Level Order Traversal——LeetCode
    Construct Binary Tree from Preorder and Inorder Traversal——LeetCode
    Construct Binary Tree from Inorder and Postorder Traversal——LeetCode
    Convert Sorted Array to Binary Search Tree——LeetCode
  • 原文地址:https://www.cnblogs.com/sorrowx/p/7268164.html
Copyright © 2020-2023  润新知