Heading for the future

Prmise.all的简单实现

注意点

  • 入参一般是个由Promise实例组成的数组,但是也可以不是数组,但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例。若参数如果不是 Promise 实例,就会先调用Promise.resolve()方法,将参数转为 Promise 实例,再进一步处理。
  • 返回值是个promise,因为可以使用.then
  • 如果全部成功,状态变为resolved, 并且返回值组成一个数组传给回调
  • 但凡有一个失败,状态变为rejected, 并将error返回给回调

简单实现

Promise.all = (promisesArr) => {
    // 返回Promise
    return new Promise((resolve, reject) => {
        let dataArr = new Array(promisesArr.length);
        let count = 0;
        for (let i = 0; i < promisesArr.length; i++) {
            // 在 .then 中收集数据,并添加 .catch,在某一个 Promise 遇到错误随时 reject。
            // 这样,在最外面调用 Promise.all().catch() 时也可以 catch 错误信息
          // 判断当前这个元素是否为Promise对象,不是则转为Promise对象
        let currentPromise = (promisesArr[i] instanceof Promise) ? promisesArr[i] : Promise.resolve(promisesArr[i]);
            currentPromise.then(res => { 
            dataArr[index] = data;
              count++;
              // 如果数据收集完了,就把收集的数据 resolve 出去
              if (count === promisesArr.length) resolve(dataArr);
        }).catch(err => { 
            //如果某一个失败,promise.all()立即执行reject回调。
              //但剩余的promise依旧继续执行,只不过对promise.all的结果不会产生影响了
            reject(err) 
        });
        }
    })
}

注意⚠️:dataArr添加时用下标而不用数组时为了防止顺序错乱

 

参考

https://blog.csdn.net/MichelleZhai/article/details/104475521

https://zhuanlan.zhihu.com/p/60287801

https://zhuanlan.zhihu.com/p/41502945

posted @ 2020-09-10 13:15  一只菜鸟攻城狮啊  阅读(325)  评论(0编辑  收藏  举报