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(2);
});
複製程式碼
總結 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)
}
})
}
複製程式碼
原文:https://segmentfault.com/a/1190000010765655