美文网首页
手撕Promise真面目(手写 promise 代码没有那么难)

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

作者: 酷酷的凯先生 | 来源:发表于2020-11-04 09:22 被阅读0次

咱们书接上文( 点我查看 ),继续咱们的手写 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

相关文章

网友评论

      本文标题:手撕Promise真面目(手写 promise 代码没有那么难)

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