1.原生promise.all运行机制
- 输入为Iterator类型的参数,可以是Array,Map, Set,String ,可能也得包括魔改的Iterator(Symbol.iterator)之类
- 若输入的可迭代数据里不是Promise,则也需要原样输出
- 返回一个Promise实例,可以调用then和catch方法
- 输出在then里体现为保持原顺序的数组
- 输出在catch体现为最早的reject返回值
- 空 Iterator, resolve返回空数组
// 实现promise.all // all方法接受一个可迭代的对象promises,可以是数组...之类的,数组的元素可能是promise也可能不只是 // 如果是promise数组,那么每个promise的执行结果就作为结果数组返回 // 如果不是promise数组,那么原数组作为结果返回 all(promises) { // 首先all方法返回的是一个promise实例对象 // all方法是当promises中的所有promise的状态均为fullfill时返回的这个promise的状态才会是fullfilled // 同时all方法执行的结果,也就是5个promise结果的集合会作为执行结果 return new Promise((resolve, reject) => { // 记录一下promises的长度,看看一共多少个promise let length = promises.length; // 结果的集合 let result = []; // 记录执行成功的promise的个数 let count = 0; // 遍历 for (let index = 0; index < length; index++) { //首先把promises中所有的元素进行一下包装 Promise.resolve(promises[index]).then((res) => { // 走到这里说明这个promise执行完成了 // 并且res是这个promise执行完成的结果 result.push(res); count++; // 如果全部执行成功了就返回 if (count === length) { resolve(result) } },(reason)=>{ // 如果有一个执行失败了,那么就宣告这个promise失败 reject(reason) }) } }) }