- 用处:并行执行一系列异步操作,返回结果集。
|
Promise.all(iterable)
方法返回一个 [Promise
],此实例在iterable
参数内所有的promise
都“完成(resolved)”或参数中不包含promise
时回调完成(resolve);如果参数中promise
有一个失败(rejected),此实例回调失败(reject),失败原因的是第一个失败promise
的结果。
- 特点:
- 返回值将会按照参数内的 promise 顺序排列,而不是由调用 promise 的完成顺序决定。
- 有一个出错,就被认定为失败。
- 返回的是一个promise。
- 参数是一个数组,而且期望每个都是promise,如果不是会直接放入结果集。
- 了解了特点,可以初步得到设计思路
- promise.all()返回值是new Promise
- 需要用一个数组存放每一个promise的结果值
- 遍历参数数组,判断是否是promise,是的话执行得到结果后压入结果数组;否则直接放入结果数组。
- 当每个都成功执行后,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
});