注意点

  • 入参一般是个由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

最新文章

  1. phpcms调取数据库的两种机制
  2. 商业信息管理系统 Bizagi 建模pattern
  3. HDU1257
  4. KDE、GNOME 和 XFCE 桌面比较
  5. Javaweb里面的filter,listener,servlet
  6. ubuntu c程序操作系统设备
  7. JS操作css的float属性的特殊写法
  8. Linux系统编程(20)——信号基本概念
  9. hdu5514 非2的次幂容斥原理
  10. Android反编译 -- 错误代码还原
  11. winform使用log4.net
  12. 记录-springcloud -mybatis(代码)
  13. EOS使用
  14. mysql 按出现次数排序
  15. js基础学习笔记(零七)
  16. VS中快捷键修改以及快捷键的查看
  17. iOS推送功能极光推送的介绍与实现
  18. MSTSC 修改端口的简单方法 3389
  19. arcgis10.2怎么把地理坐标系转化为投影坐标系(平面,米制坐标) arcmap 10.2 从 WGS_1984 转 Beijing_1954
  20. python3-requests库的使用

热门文章

  1. Qt之先用了再说系列-定时器的用法
  2. C#LeetCode刷题之#16-最接近的三数之和(3Sum Closest)
  3. Probabilistic PCA、Kernel PCA以及t-SNE
  4. Spring/Springboot——JavaConfig
  5. kafka-clients 1.0 内部请求接口文档
  6. SpringBoot整合Redis、mybatis实战,封装RedisUtils工具类,redis缓存mybatis数据 附源码
  7. maven命令下载jar包
  8. Shell编程—控制脚本
  9. 使用tess4j完成身份证和营业执照图片的文字识别
  10. “大地主”IPV6的邻居发现BD