为Promise添加一个方法

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

// 精简版
if (!Promise.list) {
    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);
})
总结欢迎指教。哈哈哈哈哈
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章