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'); });
开心的做一个无忧无虑的码农,争取每天进步一点。