美文网首页Java 核心技术Node.js
为Promise添加一个方法

为Promise添加一个方法

作者: 爱敷面膜的developer | 来源:发表于2018-03-29 19:27 被阅读3次

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

    总结: 欢迎指教。哈哈哈哈哈

    相关文章

      网友评论

        本文标题:为Promise添加一个方法

        本文链接:https://www.haomeiwen.com/subject/rqxxcftx.html