一起手寫吧!promise.all


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(e);
});

總結 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)
        }
    })
}

 

 
         


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM