- 用處:并行執(zhí)行一系列異步操作,返回結果集。
|
Promise.all(iterable)方法返回一個 [Promise],此實例在iterable參數(shù)內所有的promise都“完成(resolved)”或參數(shù)中不包含promise時回調完成(resolve);如果參數(shù)中promise有一個失?。╮ejected),此實例回調失?。╮eject),失敗原因的是第一個失敗promise的結果。
- 特點:
- 返回值將會按照參數(shù)內的 promise 順序排列,而不是由調用 promise 的完成順序決定。
- 有一個出錯,就被認定為失敗。
- 返回的是一個promise。
- 參數(shù)是一個數(shù)組,而且期望每個都是promise,如果不是會直接放入結果集。
- 了解了特點,可以初步得到設計思路
- promise.all()返回值是new Promise
- 需要用一個數(shù)組存放每一個promise的結果值
- 遍歷參數(shù)數(shù)組,判斷是否是promise,是的話執(zhí)行得到結果后壓入結果數(shù)組;否則直接放入結果數(shù)組。
- 當每個都成功執(zhí)行后,resolve(result)
- 當有一個失敗,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
});