前端面试题:代码实现Promise.all()/race()

 功能描述(MDN):

  • Promise.all():

Promise.all() 方法接收一个 promise 的 iterable 类型(注:Array,Map,Set 都属于 ES6 的 iterable 类型)的输入,并且只返回一个 Promise 实例, 那个输入的所有 promise 的 resolve 回调的结果是一个数组。这个 Promise 的 resolve 回调执行是在所有输入的 promise 的 resolve 回调都结束,或者输入的 iterable 里没有 promise 了的时候。它的 reject 回调执行是,只要任何一个输入的 promise 的 reject 回调执行或者输入不合法的 promise 就会立即抛出错误,并且 reject 的是第一个抛出的错误信息。

  • Promise.race():

**Promise.race(iterable) **方法返回一个 promise,一旦迭代器中的某个 promise 解决或拒绝,返回的 promise 就会解决或拒绝。

 代码实现:

    // 创建一个 MyPromise 类
    class MyPromise {
        // 创建静态函数 all(promises); Promises => Promise 数组
        static all(promises) {
            // 每个 Promise 成功执行组成的数组
            let resArr = [];
            // 执行的 Promise 数量
            let count = 0;
            return new Promise((resolve, reject) => {
                // 数组内的 Promise 对象同步执行
                promises.forEach((promise) => {
                    promise.then((res) => {
                        resArr.push(res);
                        count++;
                        // 如果有全部 Promise 对象的状态为 fulfilled ,
                        // 则返回 resolve(resArr)
                        if (count === promises.length) {
                            return resolve(resArr)
                        }
                    }).catch((error) => {
                        // 如果有一个 Promise 对象的状态为 rejected ,则返回 reject(error)
                        return reject(error)
                    })
                })
            })
        };
        static race(promises) {
            let errArr = []
            let count = 0;
            return new Promise((resolve, reject) => {
                promises.forEach((promise) => {
                    promise.then((res) => {
                        return resolve(res)
                    }).catch((error) => {
                        errArr.push(error);
                        count++;
                        if (count === promises.length) {
                            return reject(errArr)
                        }
                    })
                })
            })
        }
    }

代码测试:

    // MyPromise.all()
    let p1 = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(1)
        }, Math.random() * 1000)
    })
    let p2 = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(2)
        }, Math.random() * 1000)
    })
    let p3 = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(3)
        }, Math.random() * 1000)
    })

    MyPromise.all([p1, p2, p3]).then((resArr) => {
        console.log("MyPromise.all().then(): " + resArr);
    }).catch((err) => {
        console.log("MyPromise.all().catch(): " + err);
    })

    MyPromise.race([p1, p2, p3]).then((res) => {
        console.log("MyPromise.race().then(): " + res);
    }).catch((err) => {
        console.log("MyPromise.race().catch(): " + err);
    })

    Promise.all([p1, p2, p3]).then((resArr) => {
        console.log("Promise.all().then(): " + resArr);
    }).catch((err) => {
        console.log("Promise.all().catch(): " + err);
    })

    Promise.race([p1, p2, p3]).then((res) => {
        console.log("Promise.race().then(): " + res);
    }).catch((err) => {
        console.log("Promise.race().catch(): " + err);
    })

测试结果:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值