實現promise.all方法

Promise.all 接收一個 promise 對象的數組做爲參數,當這個數組裏的全部 promise 對象所有變爲resolve或 有 reject 狀態出現的時候,它纔會去調用 .then 方法,它們是併發執行的。
segmentfault

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 的特色

一、接收一個 Promise 實例的數組或具備 Iterator 接口的對象,promise

二、若是元素不是 Promise 對象,則使用 Promise.resolve 轉成 Promise 對象bash

三、若是所有成功,狀態變爲 resolved,返回值將組成一個數組傳給回調併發

四、只要有一個失敗,狀態就變爲 rejected,返回值將直接傳遞給回調
all() 的返回值也是新的 Promise 對象ui

實現 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/1190000010765655spa

相關文章
相關標籤/搜索