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