功能描述(MDN):
Promise.all():
Promise.all() 方法接收一个 promise 的 iterable 类型(注:Array,Map,Set 都属于 ES6 的 iterable 类型)的输入,并且只返回一个 Promise 实例, 那个输入的所有 promise 的 resolve 回调的结果是一个数组。这个 Promise 的 resolve 回调执行是在所有输入的 promise 的 resolve 回调都结束,或者输入的 iterable 里没有 promise 了的时候。它的 reject 回调执行是,只要任何一个输入的 promise 的 reject 回调执行或者输入不合法的 promise 就会立即抛出错误,并且 reject 的是第一个抛出的错误信息。
Promise.race():
**
Promise.race(iterable)
**方法返回一个 promise,一旦迭代器中的某个 promise 解决或拒绝,返回的 promise 就会解决或拒绝。
代码实现:
// 创建一个 MyPromise 类
class MyPromise {
// 创建静态函数 all(promises); Promises => Promise 数组
static all(promises) {
// 每个 Promise 成功执行组成的数组
let resArr = [];
// 执行的 Promise 数量
let count = 0;
return new Promise((resolve, reject) => {
// 数组内的 Promise 对象同步执行
promises.forEach((promise) => {
promise.then((res) => {
resArr.push(res);
count++;
// 如果有全部 Promise 对象的状态为 fulfilled ,
// 则返回 resolve(resArr)
if (count === promises.length) {
return resolve(resArr)
}
}).catch((error) => {
// 如果有一个 Promise 对象的状态为 rejected ,则返回 reject(error)
return reject(error)
})
})
})
};
static race(promises) {
let errArr = []
let count = 0;
return new Promise((resolve, reject) => {
promises.forEach((promise) => {
promise.then((res) => {
return resolve(res)
}).catch((error) => {
errArr.push(error);
count++;
if (count === promises.length) {
return reject(errArr)
}
})
})
})
}
}
代码测试:
// MyPromise.all()
let p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1)
}, Math.random() * 1000)
})
let p2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(2)
}, Math.random() * 1000)
})
let p3 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(3)
}, Math.random() * 1000)
})
MyPromise.all([p1, p2, p3]).then((resArr) => {
console.log("MyPromise.all().then(): " + resArr);
}).catch((err) => {
console.log("MyPromise.all().catch(): " + err);
})
MyPromise.race([p1, p2, p3]).then((res) => {
console.log("MyPromise.race().then(): " + res);
}).catch((err) => {
console.log("MyPromise.race().catch(): " + err);
})
Promise.all([p1, p2, p3]).then((resArr) => {
console.log("Promise.all().then(): " + resArr);
}).catch((err) => {
console.log("Promise.all().catch(): " + err);
})
Promise.race([p1, p2, p3]).then((res) => {
console.log("Promise.race().then(): " + res);
}).catch((err) => {
console.log("Promise.race().catch(): " + err);
})
测试结果: