✊不积跬步,无以至千里;不积小流,无以成江海
思路
一句话简单概括就是一个计数器。
Promise.all() 是 JavaScript 中 Promise 对象的一个静态方法,它接受一个 iterable 对象作为参数,该 iterable 对象包含多个 Promise 对象。Promise.all() 方法可以用于各种场景,例如:
- 并发执行多个异步操作
- 等待多个异步操作完成后再执行后续操作
- 处理多个异步操作的结果
几个要点:
- 要在promise上写而不是原型上面写
- 定义all的参数和返回值,参数是promise数组或可迭代的东西list,返回值是一个新的promise对象 new promise‘
- 如果结果成功,要用数组记录结果
- 如果结果失败,哪怕只有一个,也是整个结果都失败了,整体reject
具体思路:
- 定义一个promise函数为myAll。避免直接使用all造成冲突
- 填入输入list;输出为new promise
- 定义变量result记录成功的结果;定义count用来计数,表示当成功数量达到了list的长度-1则达到了终点
- new promise接受一个resolve和result,这两个变量决定了新的promise什么时候成功 & 什么时候失败
- 在new promise中遍历list,对于每个list我们有一个item(promise)和一个index(第几个promise)
- 然后then去等待每个变量的成功 or 失败
- 如果成功,把结果r(表示为index的第几个)记录在result里面【因为结果不一定按顺序呈现所以不要用map】
- 成功后更改计数器,并执行判断:如果list.length = count 就可以调用resolve
- 如果失败,则调用reject,并记录失败原因
实现
promise.myAll = function(){
const results = []
let count = 0
return new Promise(
(resolve,reject) =>{
list.map((item, index)=> {
item.then(result=>{
results[index] = result
count += 1
if (count >= list.length) { resolve(results)}
},
(reason) => reject(reason))
}