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://www.yuque.com/suihangadam
归来卧占楼千尺,梦落沧波明月舟。