1 promist.all() 使用
promise.all([a,b,c]) 等待所有都完成,或者第一个失败
var p1 = Promise.resolve(3);
var p2 = 1337;
var p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([p1, p2, p3]).then(values => {
console.log(values); // [3, 1337, "foo"]
});
2 promise.all() 实现
实现的关键点 promise.all([a, b, c])
- 返回一个promise
- 参数校验 arg = [a, b, c],
- 2-1 是数组,定义 记录执行个数count,返回的结果数组 result
- 2-2 不是数组,reject 参数错误
- 如果传参 arg 是个 空的可迭代对象 返回一个已完成的 promise
- 参数 a 是 promise 或者 thenable对象,返回一个已完成状态的 promise,就是调用 resolve 的静态方法。并进行 then 的操作
- 4-1 onFullfilled 记录,赋值,判断是否都执行完
- 4-2 onRejected 直接 reject
- 参数 b 不是 promise ,原样返回在结果数组里。判断是否都执行完
代码
class myPromise {
// 省略部分代码
static all(promises) {
// 1
return new myPromise((resolve, reject) => {
// 2-1
if (Array.isArray(promises)) {
let count = 0;
let result = [];
// 3
if (promises.length === 0) {
return resolve(promises);
}
promises.forEach((item, index) => {
// 4
if (item instanceof myPromise || (value instanceof Object && 'then' in value)) {
myPromise.resolve(item).then(
(value) => {
// 4-1
count++;
result[index] = value;
count === promises.length && resolve(result);
},
(reason) => {
// 4-2
reject(reason);
}
);
} else {
count++;
result[index] = item;
count === promises.length && resolve(result);
}
});
} else {
// 2-2
return reject(new TypeError("参数错误"));
}
});
}
}