Promise.all 接收一個 promise 對象的數組作為參數,當這個數組里的所有 promise 對象全部變為resolve或 有 reject 狀態出現的時候,它才會去調用 .then 方法,它們是並發執行的。
var p1 = Promise.resolve(1), p2 = Promise.resolve(2), p3 = Promise.resolve(3); Promise.all([p1, p2, p3]).then(function (results) { console.log(results); // [1, 2, 3] });
在上面的方法中,promise 數組中所有的 promise 實例都變為resolve 的時候,該方法才會返回,並將所有結果傳遞 results 數組中。
promise 數組中任何一個 promise 為 reject 的話,則整個 Promise.all 調用會立即終止,並返回一個 reject 的新的 promise 對象。reject 使用示例如下:
var p1 = Promise.resolve(1), p2 = Promise.reject(2), p3 = Promise.resolve(3); Promise.all([p1, p2, p3]).then(function (results) { //then方法不會被執行 console.log(results); }).catch(function (e){ //catch方法將會被執行,輸出結果為:2 console.log(e); });
總結 promise.all 的特點
1、接收一個 Promise 實例的數組或具有 Iterator 接口的對象,
2、如果元素不是 Promise 對象,則使用 Promise.resolve 轉成 Promise 對象
3、如果全部成功,狀態變為 resolved,返回值將組成一個數組傳給回調
4、只要有一個失敗,狀態就變為 rejected,返回值將直接傳遞給回調all() 的返回值也是新的 Promise 對象
實現 Promise.all 方法
function promiseAll(promises) { return new Promise(function (resolve, reject) { if (!isArray(promises)) { return reject(new TypeError('arguments must be an array')); } var resolvedCounter = 0; var promiseNum = promises.length; var resolvedValues = new Array(promiseNum); for (var i = 0; i < promiseNum; i++) { (function (i) { Promise.resolve(promises[i]).then(function (value) { resolvedCounter++ resolvedValues[i] = value if (resolvedCounter == promiseNum) { return resolve(resolvedValues) } }, function (reason) { return reject(reason) }) })(i) } }) }
