面试官让我手写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的结果。
相关文章
|
6月前
|
前端开发
Promise的用法&原理&手写实现-2
Promise的用法&原理&手写实现-2
20 1
|
3月前
|
前端开发 JavaScript 对象存储
【面试题】面试官为啥总是让我们手写call、apply、bind?
【面试题】面试官为啥总是让我们手写call、apply、bind?
|
3月前
|
前端开发 开发者
【面试题】手写async await核心原理,再也不怕面试官问我async await原理
【面试题】手写async await核心原理,再也不怕面试官问我async await原理
|
6月前
|
前端开发 JavaScript API
Promise的用法&原理&手写实现-1
Promise的用法&原理&手写实现-1
22 0
|
8月前
|
前端开发 JavaScript
面试官:你会手写bind apply 和bind吗?
面试官:你会手写bind apply 和bind吗?
|
11月前
|
前端开发 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
59 0
前端学习案例24-promise.all和promise.race之2
|
前端开发
前端学习案例23-promise.all和promise.race
前端学习案例23-promise.all和promise.race
51 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的应用场景举例
158 0