為Promise新增一個方法

初級碼農發表於2018-03-23

Promise在JS中可以說有著舉足輕重的地位,很早之前就看了很多Promise的文章和書籍,記得在一篇文章中看到過Promise的list方法(作用下邊有詳細介紹)還做了筆記,但是,在使用的時候卻發現現在的JS標準(ES6)不支援list方法,所以,就自己寫一個吧!哈哈哈哈哈

Promise.list():

作用:將多個Promise物件包裝成一個新的Promise物件,並行執行多個Promise物件,所有Promise物件結束觸發then事件。主要功能:若有Promise物件出錯(list方法的重點),則包裝為

{ error: "error msg" }    // 錯誤資訊

正確則返回結果。

示例:

var p = Promise.list([p1,p2,p3]);
p.then(function(values) {
    // values為[{p1的結果},{p2的結果},{p3的結果}]
})

接受引數:一個陣列,陣列每一項為Promise物件,如p1、p2、p3。

返回結果:一個陣列,順序排列每一項的結果。

實現:

if (!Promise.list) {
    Promise.list = function (jobArr) {
        let jobsResult = [];
        jobArr.forEach(function (job) {

            // 執行陣列內的Promise物件,出現錯誤包裝為{"error": reason}
            jobsResult.push(job.then(function (value) {
                return value;
            }).catch(function (reason) {
                return {"error": reason};
            }));
        })

        // 用Promise.all包裝為一個新的Promise物件
        return Promise.all(jobsResult);
    }
}

// 精簡版
Promise.list = list => Promise.all( list.map( item => item.then(val => ({val})).catch(err => ({err}))));

使用示例:

// 新增Promise.list方法
if (!Promise.list) {
    Promise.list = function (jobArr) {
        let jobsResult = [];
        jobArr.forEach(function (job) {
            jobsResult.push(job.then(function (value) {
                return value;
            }).catch(function (reason) {
                return {"error": reason};
            }));
        })
        return Promise.all(jobsResult);
    }
}

// 建立一個陣列,每一項為Promise物件
var pArr = [1, 2, 3, 4].map(function (value) {
    if (value == 3) {    // 第三個設定為會出錯的Promise物件
        return createPromise(0);
    } else {
        return createPromise(1);
    }
})

// 建立Promise物件的方法,returnStatus為1返回正確的Promise物件,其他則返回錯誤的Promise物件
function createPromise(returnStatus) {
    return new Promise(function (reslove, reject) {
        if (returnStatus == 1) {
            reslove({data: "success"});
        } else {
            reject("failed");
        }
    });
}

// 呼叫Promise.list()方法
Promise.list(pArr).then(function (value) {
    console.log("value:", value);    // 第三個會返回錯誤資訊:[ { data: 'success' },{ data: 'success' },{ error: 'failed' },{ data: 'success' } ]
}).catch(function (reason) {
    console.log("error:", reason);
})

總結:歡迎指教。哈哈哈哈哈

相關文章