一、 Promise.all的效果如下
await Promise.all([1, 2, 3]);
await Promise.all([1, Promise.resolve(2), 3]);
await Promise.all([1, Promise.resolve(2)]);
await Promise.all([1, Promise.reject(2)]);
二、分析
- 传入的得是数组
- 有一个错的,就停止,返回错的
- 返回的顺序要和输入的顺序一致
三、代码实现
Promise.all()代码实现
function pAll(_promises) {
return new Promise((resolve, reject) => {
let promises = Array.from(_promises);
let len = promises.length;
let r = [];
let count = 0;
for (let i = 0; i < len; i++) {
Promise.resolve(promises[i])
.then((o) => {
r[i] = o;
if (++count === len) {
resolve(r);
}
})
.catch((e) => {
reject(e);
});
}
});
}
const sleep = (seconds) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve(seconds);
}, seconds);
});
};
pAll([sleep(1000), sleep(1000), sleep(1000)]).then((o) => console.log(o));
await pAll([1, 2, 3]);
await pAll([1, Promise.resolve(2), 3]);
await pAll([1, Promise.resolve(2)]);
await pAll([1, Promise.reject(2)]);
四、知识点
4.1为什么用 ++count, 用count++行不行
- 不行
i++ 即后加加,原理是:先自增,然后返回自增之前的值
++i 即前加加,原理是:先自增,然后返回自增之后的值 - 要是i++,那么程序就会一直pending,因为i永远不能等于传输数组的长度,会一直比它小1。