實現promise.all方法

JayJunG發表於2019-01-15

Promise.all 接收一個 promise 物件的陣列作為引數,當這個陣列裡的所有 promise 物件全部變為resolve或 有 reject 狀態出現的時候,它才會去呼叫 .then 方法,它們是併發執行的。

var p1 = Promise.resolve(1),
    p2 = Promise.resolve(2),
    p3 = Promise.resolve(3);
Promise.all([p1, p2, p3]).then(function (results) {
    console.log(results);  // [1, 2, 3]
});
複製程式碼

在上面的方法中,promise 陣列中所有的 promise 例項都變為resolve 的時候,該方法才會返回,並將所有結果傳遞 results 陣列中。promise 陣列中任何一個 promisereject 的話,則整個 Promise.all 呼叫會立即終止,並返回一個 reject 的新的 promise 物件。reject 使用示例如下:

var p1 = Promise.resolve(1),
    p2 = Promise.reject(2),
    p3 = Promise.resolve(3);
Promise.all([p1, p2, p3]).then(function (results) {
    //then方法不會被執行
    console.log(results);
}).catch(function (e){
    //catch方法將會被執行,輸出結果為:2
    console.log(2);
});
複製程式碼

總結 promise.all 的特點

1、接收一個 Promise 例項的陣列或具有 Iterator 介面的物件,

2、如果元素不是 Promise 物件,則使用 Promise.resolve 轉成 Promise 物件

3、如果全部成功,狀態變為 resolved,返回值將組成一個陣列傳給回撥

4、只要有一個失敗,狀態就變為 rejected,返回值將直接傳遞給回撥
all() 的返回值也是新的 Promise 物件

實現 Promise.all 方法

function promiseAll(promises) {
  return new Promise(function(resolve, reject) {
    if (!isArray(promises)) {
      return reject(new TypeError('arguments must be an array'));
    }
    var resolvedCounter = 0;
    var promiseNum = promises.length;
    var resolvedValues = new Array(promiseNum);
    for (var i = 0; i < promiseNum; i++) {
      (function(i) {
        Promise.resolve(promises[i]).then(function(value) {
          resolvedCounter++
          resolvedValues[i] = value
          if (resolvedCounter == promiseNum) {
            return resolve(resolvedValues)
          }
        }, function(reason) {
          return reject(reason)
        })
      })(i)
    }
  })
}
複製程式碼


原文:https://segmentfault.com/a/1190000010765655


相關文章