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'); });