手写JavaScript中的Promise.all方法(JS中Promise.all的执行过程)
简介:
-
Promise.all是JavaScript中一种用于处理多个Promise对象的方法,该方法接收一个数组作为参数,并返回一个新的Promise对象。
-
这个新的对象会在所有Promise对象都成功解析后解析,解析的结果是一个数组,包含了所有Promise对象解析后的结果。
-
解析时如果任何一个Promise对象失败,则这个新的Promise实例会立即失败,并返回第一个失败的Promise对象的错误信息。
-
Promise.all不会改变原有的Promise对象的状态,原有的 Promise 对象仍会按照自己的状态(fulfilled或rejected)进行解析。
那么Promise.all的具体实现过程是怎样的?今天来记录学习下,话不多说,直接上代码和注释,
// 手写Promise.all方法
Promise.myPromiseAll = function (props) {// 这里定义res、rej变量,在Promsie内部赋值,// 这样外部就可以直接调用res()、rej()方法let res, rej;// 这里定义promise1,用于最后返回最终状态const promise1 = new Promise((resolve, reject) => {res = resolve;rej = reject;});//定义i 表示Promise对象的数量let i = 0;// 定义result 用于存储每个成功Promise的结果const result = [];//定义fulfilled 用于追踪已完成的Promise数量let fulfilled = 0;// 这里不能使用.length判断props数组长度,因为他有可能是一些别的可迭代对象,// 所以这里使用for of循环Promise的参数props,for of可以循环任意的可迭代对象for (const item of props) {// 这里保存的数据下标index,用于赋值成功后的data数据,形成闭包环境const index = i;// 这里每循环一次i加1,表示Promise数量i++;// 这里循环拿到的不一定是一个Promise,所以使用Promise.resolve包装一下,// 然后处理成功和失败的状态Promise.resolve(item).then((data) => {// 这里需要考虑到Promise成功时需要做到什么?1、2、// 1、完成的数据汇总到一个数组,最终结果// 在上面定义result,于存储每个成功Promise的结果,// 这里不能使用push方法,因为我们需要返回的数据是传递的顺序,不是完成的顺序// 所以这里根据下标赋值成功后的data数据result[index] = data;// 2、判定是否全部完成// 这里在上面定义fulfilled,记录每次完成fulfilled数量加1fulfilled++;// 这里判断fulfilled完成的数量和Promise数量相等时表示结束,// 把数据result给resif (fulfilled === i) { res(result); }// 这里如果失败,直接调用失败的方法,因为状态一旦确定就无法更改}, rej)// 因为这里是异步代码,运行时循环已经结束,所以i代表的一定是整体的数量}// 这里循环完成,判断i如果等于0,表示没有传递任何Promise参数// 直接给一个空数组if (i === 0) { res([]); }// 最后直接返回最终状态promise1return promise1;
}Promise.myPromiseAll([]).then((res) => {console.log(res);
}, (err) => {console.log("err", err);
})
// 输出 []Promise.myPromiseAll([1, 2, 3]).then((res) => {console.log(res);
}, (err) => {console.log("err", err);
})
// 输出 [1, 2, 3]Promise.myPromiseAll([1, 2, 3, Promise.reject(456)]).then((res) => {console.log(res);
}, (err) => {console.log("error", err);
})
// 输出 error 456Promise.myPromiseAll([1, 2, 3, Promise.resolve(456)]).then((res) => {console.log(res);
}, (err) => {console.log("err", err);
})
// 输出 [ 1, 2, 3, 456 ]
相关文章:
手写JavaScript中的Promise.all方法(JS中Promise.all的执行过程)
简介: Promise.all是JavaScript中一种用于处理多个Promise对象的方法,该方法接收一个数组作为参数,并返回一个新的Promise对象。 这个新的对象会在所有Promise对象都成功解析后解析,解析的结果是一个数组,包含了所有P…...
IP设置教程
Win 7 固定Ip设定 https://jingyan.baidu.com/article/4b07be3cbc8e7348b380f31d.html Win 10 固定Ip设定 Win10 固定IP地址方法_win10设置固定ip地址怎么设置-CSDN博客 Win 11 固定Ip设定 https://jingyan.baidu.com/article/cb5d6105be5354415c2fe0d3.html TP-LINK…...
【Azure 架构师学习笔记】-Azure Synapse -- Link for SQL 实时数据加载
本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Synapse】系列。 前言 Azure Synapse Link for SQL 可以提供从SQL Server或者Azure SQL中接近实时的数据加载。通过这个技术,使用SQL Server/Azure SQL中的新数据能够几乎实时地传送到Synapse(…...
k8s(5)
目录 使用Kubeadm安装k8s集群: 初始化操作: 每台主从节点: 升级内核: 所有节点安装docker : 所有节点安装kubeadm,kubelet和kubectl: 修改了 kubeadm-config.yaml,将其传输给…...
【服务器数据恢复】ext3文件系统下硬盘坏道掉线的数据恢复案例
服务器数据恢复环境: 一台IBM某型号服务器上有16块FC硬盘组建RAID阵列。上层linux操作系统,ext3文件系统,部署有oracle数据库。 服务器故障&检测: 服务器上跑的业务突然崩溃,管理员发现服务器上有2块磁盘的指示灯…...
Sentinel 动态规则扩展
一、规则 Sentinel 的理念是开发者只需要关注资源的定义,当资源定义成功后可以动态增加各种流控降级规则。Sentinel 提供两种方式修改规则: 通过 API 直接修改 (loadRules)通过 DataSource 适配不同数据源修改 手动通过 API 修改比较直观,…...
UE5 UE4 自定义插件自动开启关联插件(plugin enable)
在我们自己编写UE4、UE5的插件时,常常需要开启相关联的插件进行功能编写。 例如:UE4/5 批量进行贴图Texture压缩、修改饱和度_ue4批量修改纹理大小-CSDN博客 而让插件使用者每次使用时,依次进行开启其他相关联插件确实有些麻烦。 如何只需要…...
Android摄像头横屏的时候_人脸预览横向显示_问题解决---Android原生开发工作笔记164
在Android系统的平板中发现一个问题,我们做的一个Android程序,横屏的时候,摄像头在上面, 然后这个时候程序中的一个人脸预览页面,横向手持平板,摄像头在上面,但是这个时候预览的摄像头画面却是很像头像朝左,也是横过来的. private int getCameraOrientation(int cameraId) {Ca…...
网络安全防御保护 Day6
深度检测技术 DFI(深度包检测技术):主要针对完整的数据包(数据包分片,分段需要重组),之后对 数据包的内容进行识别。 DPI(深度流检测技术):一种基于流量…...
自动驾驶消息传输机制-LCM
需要用到LCM消息通讯,遂研究下。 这里写目录标题 1 LCM简介2. LCM源码分析3 LCM C教程与实例3.1 安装配置及介绍3.2 创建类型定义3.3 初始化LCM3.4 发布publish一个消息3.5 订阅和接收一个消息3.6 LCM进程间通讯3.7 注意事项?3.7.1 当数据结构定义的是数…...
架构设计实践:熟悉架构设计方法论,并动手绘制架构设计图
文章目录 一、架构设计要素1、架构设计目标2、架构设计模式(1)分而治之(2)迭代式设计 3、架构设计的输入(1)概览(2)功能需求 - WH分析法(3)质量 - “怎么”分…...
【推荐算法系列十六】:协同过滤
文章目录 参考原理基于邻域的协同过滤算法基于用户的协同过滤(User-Based Collaborative Filtering)基于内容的协同过滤 基于模型的协同过滤算法 扩展优缺点 参考 推荐系统之神经协同过滤 原理 基于邻域的协同过滤算法 基于邻域的协同过滤算法又包括…...
linux动态库加载相关
linux下动态库搜索规则 (1)编译目标代码时指定的动态库搜索路径,也就是RPATH; (2)环境变量LD_LIBRARY_PATH指定的动态库搜索路径; (3)配置文件/etc/ld.so.conf中指定的动态库搜索路径;配置完毕后需运行ldconfig命令生效; (4)默…...
python 基础绘图函数 实例
简介 在 Python 中,有许多用于绘图的库。以下是一些常用的 Python 绘图库及其基本绘图函数的简要介绍: Matplotlib: matplotlib.pyplot.plot(x, y): 绘制线图。matplotlib.pyplot.scatter(x, y): 绘制散点图。matplotlib.pyplot.bar(x, height): 绘制条…...
28. 找出字符串中第一个匹配项的下标(力扣LeetCode)
文章目录 28. 找出字符串中第一个匹配项的下标题目描述暴力KMP算法 28. 找出字符串中第一个匹配项的下标 题目描述 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。…...
1 开源鸿蒙OpenHarmony niobe407 STM32F407IGT6芯片轻型系统全量源码4.1版本下载流程
开源鸿蒙OpenHarmony niobe407 STM32F407IGT6芯片轻型系统全量源码4.1版本下载流程 作者将狼才鲸日期2024-02-27 一、前景提要 如果通过DevEco Marketplace网站获取下载源码的话,不全,有些板子下不到;OpenHarmony开发板列表,官方…...
洛谷C++简单题小练习day21—梦境数数小程序
day21--梦境数数--2.25 习题概述 题目背景 Bessie 处于半梦半醒的状态。过了一会儿,她意识到她在数数,不能入睡。 题目描述 Bessie 的大脑反应灵敏,仿佛真实地看到了她数过的一个又一个数。她开始注意每一个数码(0…9&#x…...
LabVIEW高精度闭式微小型循环泵性能测试
LabVIEW高精度闭式微小型循环泵性能测试 开发了一套基于LabVIEW的高精度闭式微小型循环泵性能测试系统,旨在通过先进的测试技术和虚拟仪器技术,对微小型循环泵的性能进行精确测量和分析,从而优化泵的设计和性能,提高其在航空、机…...
同局域网共享虚拟机(VMware)
一、前言 首先我们先来了解下 VMware 的三种网络模式桥接模式、NAT模式、仅主机模式,网络类型介绍详情可以参考下我之前的文档 Linux系统虚拟机安装(上)第三章 - 第9步指定网络类型。了解三种网络模式的原理之后,再来剖析下需求&…...
docker学习快速入门
目录 Linux下安装docker配置阿里云镜像加速docker命令部署安装Tomcat、ES容器数据卷DockerFiledocker网络制作tomcat镜像Redis集群部署SpringBoot微服务打包docker镜像拓展 什么是Docker Docker是内核级别的虚拟化,可以在一个物理机上可以运行很多的容器实例。服务…...
TlbbGmTool:5分钟上手,轻松管理天龙八部单机版游戏数据
TlbbGmTool:5分钟上手,轻松管理天龙八部单机版游戏数据 【免费下载链接】TlbbGmTool 某网络游戏的单机版本GM工具 项目地址: https://gitcode.com/gh_mirrors/tl/TlbbGmTool 还在为管理《天龙八部》单机版游戏数据而烦恼吗?是否每次调…...
CuteTranslation:Linux桌面端智能翻译工具的技术实现与应用实践
CuteTranslation:Linux桌面端智能翻译工具的技术实现与应用实践 【免费下载链接】CuteTranslation Linux屏幕取词翻译软件 项目地址: https://gitcode.com/gh_mirrors/cu/CuteTranslation 在Linux桌面环境中,你是否经常遇到这样的场景:…...
Koikatu HF Patch终极指南:如何快速优化你的Koikatsu游戏体验
Koikatu HF Patch终极指南:如何快速优化你的Koikatsu游戏体验 【免费下载链接】KK-HF_Patch Automatically translate, uncensor and update Koikatu! and Koikatsu Party! 项目地址: https://gitcode.com/gh_mirrors/kk/KK-HF_Patch Koikatu HF Patch是一款…...
从老古董NE555到单片机:手把手教你做一个简易数字频率计(STC89C52)
从NE555到STC89C52:打造高性价比数字频率计的完整指南 在电子爱好者的世界里,测量信号频率是一项基础却至关重要的技能。想象一下,当你调试一个振荡电路时,能够实时看到信号频率的变化;或者当你需要验证一个传感器输出…...
别再硬编码了!用Avue的findObject方法动态更新表单选项(附完整代码示例)
动态表单进阶:Avue中findObject的实战应用与性能优化 在开发中后台管理系统时,表单的动态化需求几乎无处不在。想象这样一个场景:当用户选择不同租户时,角色、部门和岗位的选项需要实时变化。传统硬编码方式不仅难以维护ÿ…...
Nginx反向代理SSE长连接:配置优化与性能调优实战
1. 为什么需要Nginx反向代理SSE长连接 最近在做一个实时数据监控项目时,遇到了一个棘手的问题:当有大量客户端同时连接SSE服务时,后端服务器直接崩溃了。这让我意识到,像SSE这样的长连接服务,如果没有合适的代理层做缓…...
nli-distilroberta-base惊艳案例:处理长难句、否定嵌套、指代消解等复杂逻辑场景
nli-distilroberta-base惊艳案例:处理长难句、否定嵌套、指代消解等复杂逻辑场景 1. 项目概述 nli-distilroberta-base是一个基于DistilRoBERTa模型的自然语言推理(NLI)Web服务,专门用于分析两个句子之间的逻辑关系。这个轻量级…...
opencode AI 编码代理在公司级、私有化的表现到底如何
OpenCode 是一个开源的 AI 编码代理。它提供终端界面、桌面应用和 IDE 扩展等多种使用方式。如果我们想在公司级使用,在确保数据、代码安全的前提下,它是目前最优解之一,支持的插件足够多,速度还可以,速度取决于模型的…...
Unity URP项目里Post Processing效果加上了却没显示?5个必查项帮你快速排错
Unity URP项目后处理失效排查指南:从原理到实战的深度解析 在Unity的URP(Universal Render Pipeline)项目中,后处理效果是提升画面表现力的重要手段。但许多开发者在实际配置过程中常遇到一个令人困惑的问题:明明按照教…...
Razor组件热重载失效、断点不命中、CSS隔离丢失——Blazor开发工具链2026年最新兼容性黑洞清单(VS 17.12+ Rider 2026.1实测)
第一章:Razor组件热重载失效、断点不命中、CSS隔离丢失——Blazor开发工具链2026年最新兼容性黑洞清单(VS 17.12 Rider 2026.1实测)核心现象复现路径 在 VS 17.12.0(Build 34982.212)与 JetBrains Rider 2026.1.1&…...
