- 用處:并行執(zhí)行一系列異步操作圾结,返回結(jié)果集腺律。
|
Promise.all(iterable)
方法返回一個 [Promise
]五鲫,此實例在iterable
參數(shù)內(nèi)所有的promise
都“完成(resolved)”或參數(shù)中不包含promise
時回調(diào)完成(resolve)展父;如果參數(shù)中promise
有一個失敿旱ァ(rejected)敢朱,此實例回調(diào)失敿袅狻(reject)摩瞎,失敗原因的是第一個失敗promise
的結(jié)果。
- 特點:
- 返回值將會按照參數(shù)內(nèi)的 promise 順序排列孝常,而不是由調(diào)用 promise 的完成順序決定旗们。
- 有一個出錯,就被認(rèn)定為失敗构灸。
- 返回的是一個promise上渴。
- 參數(shù)是一個數(shù)組,而且期望每個都是promise冻押,如果不是會直接放入結(jié)果集驰贷。
- 了解了特點,可以初步得到設(shè)計思路
- promise.all()返回值是new Promise
- 需要用一個數(shù)組存放每一個promise的結(jié)果值
- 遍歷參數(shù)數(shù)組洛巢,判斷是否是promise括袒,是的話執(zhí)行得到結(jié)果后壓入結(jié)果數(shù)組;否則直接放入結(jié)果數(shù)組稿茉。
- 當(dāng)每個都成功執(zhí)行后锹锰,resolve(result)
- 當(dāng)有一個失敗,reject
function isPromise(obj) {
return !!obj && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function';
}
const myPromiseAll = (arr)=>{
let result = [];
return new Promise((resolve,reject)=>{
for(let i = 0;i < arr.length;i++){
if(isPromise(arr[i])){
arr[i].then((data)=>{
result[i] = data;
if(result.length === arr.length){
resolve(result)
}
},reject)
}else{
result[i] = arr[i];
}
}
})
}
- 測試:
let p1 = Promise.resolve(3);
let p2 = 1337;
let p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
myPromiseAll([p1, p2, p3]).then(values => {
console.log(values); // [3, 1337, "foo"]
});
- 有一個操作失敗情況
let p1 = new Promise((resolve, reject) => {
setTimeout(resolve, 1000, 'one');
});
let p2 = new Promise((resolve, reject) => {
setTimeout(resolve, 2000, 'two');
});
let p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 3000, 'three');
});
let p4 = new Promise((resolve, reject) => {
setTimeout(resolve, 4000, 'four');
});
let p5 = new Promise((resolve, reject) => {
reject('reject');
});
myPromiseAll([p1, p2, p3, p4, p5]).then(values => {
console.log(values);
}, reason => {
console.log(reason);// reject
});