Promise.all的实现和原理

1,710 阅读1分钟
Promise.all 功能:

         Promise.all(iterable)返回一个新的Promise实例,此实例在iterable参数内素有的Promise都fulfilled或者参数中不包含Promise时,状态变成fulfilled。 如果参数中Promise有一个失败rejected ,此实例回调失败,失败原因的是第一个失败Promise的返回结果 

let p = Promise.all([p1,p2,p3])

p的状态由 p1,p2,p3决定,分成以下;两种情况: 

(1)只有p1、p2、p3的状态都变成 fulfilled,p的状态才会变成 fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。 

(2)只要p1、p2、p3之中有一个被 rejected,p的状态就变成 rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。

代码如下:

Promise.all = function (promise) {
    return new Promise((resolve, reject) => {
    let index = 0
    let result = []
if (promise.length === 0) {
     resolve(result)
} else {
    function processValue(i, data) {
          result[i] = data
          if (++index === promise.length) {
              resolve(result)
         }
   }
   for (let i = 0; i < promise.length; i++) {
        Promise.resolve(promise[i]).then((data) => {
             processValue(i, data)
        }, (err) => {
            reject(err) return
       })
   }
 }
})

}