手撕Promise真面目(手写 promise 代码没有那么难)五

咱们书接上文( 点我查看 ),继续咱们的手写 Promise

# 第五步:Promise .all() / race() 的实现

/**
 * @func Promise 函数对象的 all()
 * @param  promises 请求数组
 * @returns 返回一个 Promise
 * @returns 只有 Promise 都成功时才成功,只要有一个失败就失败,并返回失败的 Promise
 */
Promise.all = function(promises){
    // 用来保存所有成功value的数组
    const values = new Array(promises.length);
    // 用来保存成功Promise的数量
    let resolvedCount = 0;
    // 返回一个新的Promise
    return new Promise((resolve, reject)=>{
        // 遍历 promises 获取每个 Promise 的结果
        promises.forEach((p,index)=>{
            Promise.resolve(p).then(
                value => {
                    resolvedCount++

                    // 将成功的 value 保存至 values
                    values[index] = value;

                    // 如果全部成功,return 的 Promise 的状态为成功
                    if(resolvedCount == promises.length){
                        resolve(values)
                    }
                },
                reason =>{
                    // 只要有一个失败了,return 的 Promise 就是失败
                    reject(reason);
                }
            )
        })
    })
}

/**
 * @func Promise 函数对象的 race()
 * @param  promises 请求数组
 * @returns 返回一个 Promise,其结果由第一个完成的 Promise 决定
 */
Promise.race = function(promises){
    // 返回一个新的 Promise
    return new Promise((resolve, reject)=>{
        // 遍历 promises 取出每个 Promsie 的结果
        promises.forEach(p => {
            Promise.resolve(p).then(
                value => {
                    // 一旦有一个成功了, return 的 Promise 就成功
                    resolve(value);
                },  
                reason =>{
                    // 一旦有一个失败了, return 的 Promise 就失败
                    reject(reason);
                }
            )
        })
    })
}

测试demo

方法 all():
const p1 = Promise.resolve(Promise.resolve(1));
const p2 = Promise.resolve(2);
const p3 = Promise.resolve(3);

Promise.all([p1,p2,p3]).then(
    value=>{
        console.log(value)
    },
    reason => {
        console.log(reason)
    }
);
输出为 [1,2,3]

方法 race():
const p1 = Promise.resolve(Promise.resolve(1));
const p2 = Promise.resolve(2);
const p3 = Promise.reject(3);

Promise.race([p1,p2,p3]).then(
    value=>{
        console.log(value)
    },
    reason => {
        console.log(reason)
    }
);
输出为 2

哇哦,又又又简单实现了一小步,我们不骄傲,继续努力~~~

下一篇:自定义 resolveDelay 与 rejectDelay

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容