all方法 手写promise_Promise静态方法(all, race)实现

328e6ad348c30958ccb44fb148317c71.png

先在浏览器控制台使用下Promise.all看下它干了啥

e7624623fbc24f33f44eae83ecadb4e5.png

可以看到Promise.all()函数参数是一个promise数组(p1, p2),返回值也是一个promise。同时返回的promise里resolve的值是参数数组中每个promise的结果组成的数组,而且是参数中所有promise都执行完按序输出(上图中在1100ms后打印出[1, 2])。

85ac452dc1420d2d3bb08d218ff87bf2.png

同时只要参数数组中其中任何一个promise运行出错就立即结束并返回该promise。(上图在1000ms后返回出错的p2)

根据这两点就可以实现一个简易的Promise.all方法了:

/**
 * @description: Promise.all方法实现
 * @param {array} list - promise组成的数组
 * @return Promise
 */
Promise.all = function(list) {
    if (!Array.isArray(list)) throw new Error(`The argument should be an array`)

    const len = list.length
    const result = []
    let count = 0 

    return new Promise((resolve, reject) => {
        try {
            for (let i = 0; i < len; ++i) {
                list[i].then(data => {
                    result[i] = data
                    ++count
                    count === len ? resolve(result) : ''
                }, reject)
            }
        } catch (e) {
            reject(e)
        }
    })
}

Promise.race方法相对来说简单一点,参数也是promise数组,数组中任何一个promise改变状态就返回该promise:

/**
 * @description: Promise.race方法实现
 * @param {array} list - promise组成的数组
 * @return Promise
 */
Promise.race = function(list) {
    if (!Array.isArray(list)) throw new Error(`The argument should be an array`)

    const len = list.length

    return new Promise((resolve, reject) => {
        try {
            for (let i = 0; i < len; ++i) {
                list[i].then(data => resolve(data), reject)
            }
        } catch (e) {
            reject(e)
        }
    })
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值