parallel方法 异步并行执行

Promise提供了all方法, 但是状态只有2种,
第一种是所有promise实例都成功则返回值组成一个数组,传递给p的回调函数;
第二种是有一个实例被rejected,状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
问题:其实我想要所有异步的结果,不管成功与否,然后根据结果遍历做相应的事, 下面方法就是这么产生的。

 

        /**
         * 并行执行异步,每个异步不管成功与否,都把结果放入result中,作为回调的第一个参数
         * @param  {[type]}   arr      [arr数组中全都是promise实例]
         * @param  {Function} callback [等所有异步完成后的回调 result是结果,作为其第一个参数]
         */
        var parallel = function (arr, callback) {
            if (Array.isArray(arr)) {
                let times = arr.length;
                let done = _after(times, callback);
                for (let i = 0; i <= times - 1; i ++) {
                    let p = (arr[i] instanceof Promise) ? arr[i] : Promise.resolve(arr[i]);
                    p.then(function(result) {
                        done(String(i+1), result);
                    }).catch(function(reason) {
                        done(String(i+1), reason);
                    });
                };
            } else {
                console.error(`必须是数组,数组元素均为Promise实例`);
            };

            function _after(times, callback) {
                let count = 0, result = {};

                return function(key, value) {
                    result[key] = value;
                    count ++;
                    if (count === times) {
                        callback && callback(result);
                    };
                };
            };
        };

 

        // 使用/测试
        function a() {
            return 'a';
        }

        function b() {
            return new Promise(function(resolve, reject) {
                setTimeout(()=> {
                    resolve('b');
                }, 4000);
            });
        }; 

        function c() {
            return new Promise(function(resolve, reject) {
                setTimeout(()=> {
                    resolve('c');
                }, 2000);
            });
        }; 

        var promises = [a(), b(), c()];
        console.time('lab');
        parallel(promises, function(result) {
            console.log(result);
            console.timeEnd('lab');
        });

 

posted @ 2017-06-22 18:50  Sorrow.X  阅读(1047)  评论(0编辑  收藏  举报