Promise.all
接收一個 promise
對象的數組做爲參數,當這個數組裏的全部 promise
對象所有變爲resolve
或 有 reject
狀態出現的時候,它纔會去調用 .then
方法,它們是併發執行的。
segmentfault
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
實例的數組或具備 Iterator
接口的對象,promise
二、若是元素不是 Promise
對象,則使用 Promise.resolve
轉成 Promise
對象bash
三、若是所有成功,狀態變爲 resolved
,返回值將組成一個數組傳給回調併發
四、只要有一個失敗,狀態就變爲 rejected
,返回值將直接傳遞給回調all()
的返回值也是新的 Promise
對象ui
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/1190000010765655spa