手写Promise.all()

1,497 阅读1分钟

应好友邀请,手写一个promise.all方法记录下来

  • 入参是个数组, 如一组axios请求,当然了,也可以传一些乱七八糟的来祸害祸害
  •  返回值是个promise,因为可以使用.then
  • 如果全部成功,状态变为resolved, 并且返回值组成一个数组传给回调 
  • 但凡有一个失败,状态变为rejected, 并将error返回给回调  

    				function myPromiseAll(promises) {
    					return new Promise((resolve, reject) => {
    						if (!Array.isArray(promises)) {
    							throw new TypeError("params must be an array")
    						}
    						let result = [] // 存放结果
    						let count = 0 // 记录有几个结果完成,当等于 promises.length时返回结果result
    								
    						for (let i = 0; i < promises.length;i++) {
    							let promise = promises[i]
    							// 期待的是promise,如果不是的话,直接把当前的值放到数组中
    							if (Object.prototype.toString.call(promise).indexOf('Promise') < 0) {
    								result[i] = promise
    								count++
    								count === promises.length && resolve(result) // 判断是否已经完成
    								continue
    							}
    													
    							promise.then((res) => {
    								result[index] = res
    								count++
    								count === promises.length && resolve(result) // 判断是否已经完成
    		
    							}).catch((err) => {
    								reject(err)
    							})
    						}
    					})
    				}
    
    
    				myPromiseAll([1,2 ,3 ,4 , 5]).then(res => {
    						console.log(res)
    				})