【前端八股】手写Promise.all
浏览 433 | 评论 0 | 字数 1099
TTQ
2022年04月22日
  • 描述

    手写代码实现Promise.all

    Promise.all()方法接收一个promiseiterable类型(注:ArrayMapSet都属于ES6的iterable类型)的输入,并且只返回一个Promise实例, 那个输入的所有promiseresolve回调的结果是一个数组。这个Promiseresolve回调执行是在所有输入的promiseresolve回调都结束,或者输入的iterable里没有promise了的时候。它的reject回调执行是,只要任何一个输入的promisereject回调执行或者输入不合法的promise就会立即抛出错误,并且reject的是第一个抛出的错误信息。

    思路

    接收一个promises数组,获取它的长度,记录已经完成的Promise数量和结果,返回一个Promise对象,当promises中所有的Promise都完成时返回结果数组,对所有Promise遍历执行,当其完成时使得完成的Promise数量增加即可,当出现rejected时直接reject

    代码

    function myAll(promises) {
      const len = promises.length;
      const result = new Array(len);
      let doneCnt = 0;
      return new Promise((resolve, reject) => {
        if (len == 0) {
          resolve(result);
        }
        for (let i = 0; i < len; i++) {
          Promise.resolve(promises[i]).then(
            (data) => {
              result[i] = data;
              doneCnt++;
              if (doneCnt == len) {
                resolve(result);
              }
            },
            (err) => reject(err)
          );
        }
      });
    }
    
    Promise.myAll = myAll;
    本文作者:TTQ
    本文链接:https://blog.ponder.fun/archives/145.html
    最后修改时间:2022-04-22 21:59:10
    本站未注明转载的文章均为原创,并采用 CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!
    评论
    与本文无关评论请发留言板。请不要水评论,谢谢。
    textsms
    支持 Markdown 语法
    email
    link
    评论列表
    暂无评论