zoukankan      html  css  js  c++  java
  • 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');
            });
  • 相关阅读:
    游戏中转轮抽奖的算法实现[转]
    前端的一份配置(备份)
    [转]Jquery通用开源框架之【ejq.js】
    【完整靠谱版】结合公司项目,仔细总结自己使用百度编辑器实现FTP上传的完整过程
    用Putty连接Linux
    使用Nginx的proxy_cache缓存功能取代Squid
    nginx for windows 配置多域名反向代理
    详细解析用Squid实现反向代理的方法
    用Squid和DNSPod打造自己的CDN详细教程
    WINDOWS下的squid
  • 原文地址:https://www.cnblogs.com/sorrowx/p/7066675.html
Copyright © 2011-2022 走看看