重写promise.all

使用

var promise1 = Promise.resolve(3);
var promise2 = 42;
var promise3 = new Promise(function(resolve, reject) {
  setTimeout(resolve, 100, 'foo');
});

Promise.all([promise1, promise2, promise3]).then(function(values) {
  console.log(values);
});

分析

1.参数为iterator类型
2.并发执行
3.等待所有promise返回后才返回结果
4.结果为数组,与传入的promise顺序对应
5.但凡有一个出错,则抛错

实现


Promise.myAll = function (Iterator) {
  return new Promise((resolve, reject) => {
    // 转换成数组,好处是方便获取长度,且方便对应结果数组的index
    const arr = Array.from(Iterator);
    const { length } = arr;
    const result = [];
    // 无length则无法执行for of,所以此处特殊值处理
    if (!length) return result;

    //计数,个数达到length即全部执行完
    let count = 0;

    for (let index = 0; index < length; index++) {
      const promise = arr[index];

      promise
        .then((res) => {
          result[index] = res;
          if (++count === length) resolve(result);
        })
        .catch((err) => {
          reject(err);
        });
    }
  });
};

测试案例


const test = async () => {
  var promise1 = Promise.resolve(3);
  var promise2 = Promise.resolve({ name: "shuaige" });
  var promise3 = new Promise(function (resolve, reject) {
    setTimeout(resolve, 100, "foo");
  });

  Promise.myAll([promise3, promise1, promise2]).then(function (values) {
    console.log(values);
  });
};

test();
//[
///"foo",
//3,
//{ name: "shuaige" }
//]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • # 手写实现Promise ## Promise异步编程 &emsp;&emsp;异步编程简介:无论在浏览器环境还...
    Danker阅读 3,290评论 0 0
  • ECMAScript - 学习笔记 🎬 🧩nvm node.js 包管理工具 nvm github[https:/...
    Super三脚猫阅读 4,243评论 0 1
  • 这篇文章主要介绍如何编写面向对象的JavaScript。我们先从现代JavaScript语言的基本概念开始介绍,然...
    Leesper阅读 5,057评论 0 0
  • 1.Promise是什么? Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理...
    YINdevelop阅读 3,587评论 0 1
  • 第一章:块级作用域绑定 块级声明 1.var声明及变量提升机制:在函数作用域或者全局作用域中通过关键字var声明的...
    BeADre_wang阅读 4,411评论 0 0

友情链接更多精彩内容