如何实现一个 Promise.all

一、 Promise.all的效果如下

await Promise.all([1, 2, 3]);
//-> [1, 2, 3]

await Promise.all([1, Promise.resolve(2), 3]);
//-> [1, 2, 3]

await Promise.all([1, Promise.resolve(2)]);
//-> [1, 2]

await Promise.all([1, Promise.reject(2)]);
//-> Throw Error: 2

二、分析

  • 传入的得是数组
  • 有一个错的,就停止,返回错的
  • 返回的顺序要和输入的顺序一致

三、代码实现

Promise.all()代码实现

// 代码实现部分
function pAll(_promises) {
  return new Promise((resolve, reject) => {
    // Iterable => Array
    let promises = Array.from(_promises);
    let len = promises.length;
    let r = [];
    let count = 0;
    for (let i = 0; i < len; i++) {
      // Promise.resolve 确保把所有数据都转化为 Promise
      Promise.resolve(promises[i])
        .then((o) => {
          // 因为 promise 是异步的,保持数组一一对应
          r[i] = o;
          // 如果数组中所有 promise 都完成,则返回结果数组
          if (++count === len) {
            resolve(r);
          }
        })
        .catch((e) => {
          reject(e);
        });
    }
  });
}


// 测试部分
// const sleep = (seconds) =>
//   new Promise((resolve) => setTimeout(() => resolve(seconds), seconds));

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]);
//-> [1, 2, 3]
await pAll([1, Promise.resolve(2), 3]);
//-> [1, 2, 3]
await pAll([1, Promise.resolve(2)]);
//-> [1, 2]
await pAll([1, Promise.reject(2)]);
//-> Throw Error: 2

四、知识点

4.1为什么用 ++count, 用count++行不行

  • 不行
    i++ 即后加加,原理是:先自增,然后返回自增之前的值
    ++i 即前加加,原理是:先自增,然后返回自增之后的值
  • 要是i++,那么程序就会一直pending,因为i永远不能等于传输数组的长度,会一直比它小1。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值