美文网首页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添加实现方法 promise.finally promise.all promi...

  • 为Promise添加一个方法

    Promise在JS中可以说有着举足轻重的地位,很早之前就看了很多Promise的文章和书籍,记得在一篇文章中看到...

  • fs 的替代品 fs-extra

    fs-extra是fs的一个扩展,提供了非常多的便利API,并且继承了fs所有方法和为fs方法添加了promise...

  • ES6之promise(then与catch)

    一、 Promise.prototype.then 它的作用是为 Promise 实例添加状态改变时的回调函数。前...

  • ES7 async await

    async await:用同步的方式来写异步async函数返回一个 Promise 对象,可以使用then方法添加...

  • Promise

    Promise promise坠落现象 以上输出为 foo .会很奇怪 Promise的then方法的参数期望是函...

  • async、await

    1、async 函数返回一个 Promise 对象,可以使用 then 方法添加回调函数。 2、await 操作符...

  • Promise对象

    Promise对象 创造一个Promise实例 then方法 Promise实例生成以后,可以用then方法分别指...

  • ES6 Promise对象then方法链式调用

    then()方法的作用是Promise实例添加解决(fulfillment)和拒绝(rejection)状态的回调...

  • async-await 网上看到的记录

    一、走进Async-await原理1、原理1async函数返回一个 Promise 对象,可以使用then方法添加...

网友评论

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

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