Prmise.all的简单实现
2024-08-31 07:27:10
注意点
- 入参一般是个由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
最新文章
- phpcms调取数据库的两种机制
- 商业信息管理系统 Bizagi 建模pattern
- HDU1257
- KDE、GNOME 和 XFCE 桌面比较
- Javaweb里面的filter,listener,servlet
- ubuntu c程序操作系统设备
- JS操作css的float属性的特殊写法
- Linux系统编程(20)——信号基本概念
- hdu5514 非2的次幂容斥原理
- Android反编译 -- 错误代码还原
- winform使用log4.net
- 记录-springcloud -mybatis(代码)
- EOS使用
- mysql 按出现次数排序
- js基础学习笔记(零七)
- VS中快捷键修改以及快捷键的查看
- iOS推送功能极光推送的介绍与实现
- MSTSC 修改端口的简单方法 3389
- arcgis10.2怎么把地理坐标系转化为投影坐标系(平面,米制坐标) arcmap 10.2 从 WGS_1984 转 Beijing_1954
- python3-requests库的使用
热门文章
- Qt之先用了再说系列-定时器的用法
- C#LeetCode刷题之#16-最接近的三数之和(3Sum Closest)
- Probabilistic PCA、Kernel PCA以及t-SNE
- Spring/Springboot——JavaConfig
- kafka-clients 1.0 内部请求接口文档
- SpringBoot整合Redis、mybatis实战,封装RedisUtils工具类,redis缓存mybatis数据 附源码
- maven命令下载jar包
- Shell编程—控制脚本
- 使用tess4j完成身份证和营业执照图片的文字识别
- “大地主”IPV6的邻居发现BD