手写Promise.all
2021/5/24 18:56:59
本文主要是介绍手写Promise.all,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一、Pormise.all
它接受一个Promise对象组成的数组
。返回一个新的Promise
,只有所有的Promise都成功才成功,只要有一个失败了就直接失败。成功的结果是每个Promise成功结果组成的数组
,失败的结果是Promise数组中失败的结果
。
- 传入一个 Iterable,但大部分情况下是数组,以下以数组代替
- 传入一个数组,其中可包含 Promise,也可包含普通数据
- 数组中 Prmise 并行执行
- 但凡有一个 Promise 被 Reject 掉,Promise.all 失败
- 保持输出数组位置与输入数组一致
- 所有数据 resolve 之后,返回结果
二、实现
function pAll (_promises) { return new Promise((resolve, reject) => { // Iterable => Array const promises = Array.from(_promises) // 结果用一个数组维护 const res = [] const len = promises.length let count = 0 for (let i = 0; i < len; i++) { // Promise.resolve 确保把所有数据都转化为 Promise Promise.resolve(promises[i]).then(result=> { // 因为 promise 是异步的,保持数组一一对应 // 如果参数是 Promise 实例,那么Promise.resolve将不做任何修改、原封不动地返回这个实例。 res[i] = result; // 如果数组中所有 promise 都完成,则返回结果数组 if (++count === len) { resolve(res) } // 当发生异常时,直接 reject }).catch(err => reject(err)) } }) }
其中有几个点:
Array.from()
方法就是将一个类数组对象或者可遍历对象转换成一个真正的数组。Promise.resolve
确保把所有数据都转化为 Promise,如果参数是 Promise 实例
,那么Promise.resolve将不做任何修改、原封不动地返回这个实例
。
参考:https://github.com/shfshanyue/Daily-Question/issues/500
这篇关于手写Promise.all的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-16Maven资料入门指南
- 2024-11-16Maven资料入门教程
- 2024-11-16MyBatis Plus资料:新手入门教程与实践指南
- 2024-11-16MyBatis-Plus资料入门教程:快速上手指南
- 2024-11-16Mybatis资料入门教程:新手必看指南
- 2024-11-16MyBatis资料详解:新手入门与初级实战指南
- 2024-11-16MyBatisPlus资料:初学者入门指南与实用教程
- 2024-11-16MybatisPlus资料详解:初学者入门指南
- 2024-11-16MyBatisX资料:新手入门与初级教程
- 2024-11-16RESTful接口资料详解:新手入门指南