面试官让我手写Promise.all

简介: 面试官让我手写Promise.all

原生的Promise.all有什么特点?

  1. 特点1:接收一个可迭代对象
  2. 特点2:传入的数据中可以是普通数据,也可以是Promise对象
  3. 特点3:可迭代对象的promise是并行执行的
  4. 特点4:保持输入数组的顺序和输出数组的顺序一致
  5. 特点5:传入数组中只要有一个reject,立即返回reject
  6. 特点6:所有数据resolve之后返回结果

实现Promise.all

1:函数返回的是一个Promise对象

function myPromiseAll(iterable) {
    return new Promise((resolve,reject) => {
    })
}
复制代码

2:将可迭代对象转换为一个数组

const promises = Array.from(iterable);
复制代码

3:并发执行每一个Promise

// 定义一个计数器用来判断是否所有的promise执行完毕
let count = 0;
// 并发执行每一个promise
for (let i = 0; i < promises.length; i++) {
    Promise.resolve(promises[i]).then(res => {
        result[i] = res;
        count++;
        if (count === promises.length) {
            resolve(result);
        }
    }).catch(err => reject(err))
}
复制代码

第三步是实现Promise.all的核心,有几点需要我们注意:

  1. 并不是push进result数组的,而是通过下标的方式进行存储,这是因为我们为了保证输出的顺序,因为Promise对象执行的时间可能不同,push的话会破坏顺序。
  2. 通过计数标志来判断是否所有的promise对象都执行完毕了,因为在then中表示该promise对象已经执行完毕。

完整实现

function myPromiseAll(iterable) {
    return new Promise((resolve,reject) => {
        const promises = Array.from(iterable);
        // 定义Promise对象resolve的数组
        const result = [];
        // 定义一个计数器用来判断是否所有的promise执行完毕
        let count = 0;
        // 并发执行每一个promise
        for (let i = 0; i < promises.length; i++) {
            Promise.resolve(promises[i]).then(res => {
                result[i] = res;
                count++;
                if (count === promises.length) {
                    resolve(result);
                }
            }).catch(err => reject(err))
        }
    })
}
复制代码

Promise.all的实现给我们什么启示

  • Promise.all返回的是一个Promise对象
  • Promise.all接收的可迭代对象数组需要通过Array.from转换为数组
  • Promise.all是并发执行的。
  • Promise.all中一个reject直接返回reject的结果。
相关文章
|
4天前
|
前端开发 JavaScript API
【面试题】说说 Promise是什么?如何使用
【面试题】说说 Promise是什么?如何使用
|
4天前
|
前端开发 JavaScript 对象存储
【面试题】面试官为啥总是让我们手写call、apply、bind?
【面试题】面试官为啥总是让我们手写call、apply、bind?
|
9月前
Promise.all和Promise.race的区别和使用
比如当数组里的P1,P2都执行完成时,页面才显示。 值得注意的是,返回的数组结果顺序不会改变,即使P2的返回要比P1的返回快,顺序依然是P1,P2 Promise.all成功返回成功数组, 失败返回失败数据,一但失败就不会继续往下走
|
9月前
|
前端开发 JavaScript
面试官:你会手写bind apply 和bind吗?
面试官:你会手写bind apply 和bind吗?
|
前端开发 C++
【面试】‘return await promise‘ 与 ‘return promise‘ 这细微的区别,你的可能还不知道?
当从一个异步函数的promise返回时,我们可以使用return await promise等待 promise 解析完,也可以直接返回它 return promise。
|
前端开发
前端学习案例24-promise.all和promise.race之2
前端学习案例24-promise.all和promise.race之2
62 0
前端学习案例24-promise.all和promise.race之2
|
前端开发
前端学习案例23-promise.all和promise.race
前端学习案例23-promise.all和promise.race
53 0
前端学习案例23-promise.all和promise.race
|
前端开发
前端学习案例1-promise之promise.all
前端学习案例1-promise之promise.all
52 0
前端学习案例1-promise之promise.all
|
前端开发
Promise.all和promise.race的应用场景举例
Promise.all和promise.race的应用场景举例
159 0
|
前端开发
promise.all()的用法和相关面试题
promise.all()的用法和相关面试题