手写promise原理系列八:封装Promise.all方法,Promise.all的用法
创始人
2025-05-28 02:09:02

在这里插入图片描述

小伙伴们,你们好,“手写promise原理系列” 马上进入尾声了,我打算出到"手写promise原理系列九"便结束了。

为什么要出到系列九呢?大概是因为九这个数字吧!中国传统文化中,"十"是满盈之数,物极必反,盛极必衰,所以自谨待之;而"九"为百尺竿头更进一步,也希望自己能爬到百尺竿头,更进一步。九也为极之数,阳之数;在易经中,阳爻(yao)用九,阴爻用六,而乾卦为六个阳爻组成,《大象传》为乾卦立义为:天行健,君子以自强不息。

扯远了,回归正题。

当前章节探讨一下 Promise.all 方法的用法以及封装。

all 单词的释义我们可以知道是 全部 的意思,其实就是全部 promise 对象执行成功才返回结果,只要有一个失败,就返回失败的结果。

先来看失败的调用方式:

let p1 = new Promise((resolve, reject) => {resolve("111");
});
let p2 = Promise.reject("222"); // 改变状态为失败 reject
let p3 = Promise.resolve("333");
let result = Promise.all([p1, p2, p3]); // 参数为 promise 对象组成的数组
console.log(result);

在这里插入图片描述
Promise.all 方法的参数是一个 promise 对象组成的数组,当 Promise.all 方法的参数中有一个失败的状态时,直接返回当前失败的 promise 对象的状态以及结果。

再来看同步执行成功的调用方式:

let p1 = new Promise((resolve, reject) => {resolve("111");
});
let p2 = Promise.resolve("222");
let p3 = Promise.resolve("333");
let result = Promise.all([p1, p2, p3]);
console.log(result);

在这里插入图片描述

还有异步执行成功的调用方式:

let p1 = new Promise((resolve, reject) => {setTimeout(()=>{resolve("111");}, 1000)
});
let p2 = Promise.resolve("222");
let p3 = Promise.resolve("333");
let result = Promise.all([p1, p2, p3]);
console.log(result);

在这里插入图片描述
由上面的同步、异步调用方式可知,不管 promise 对象是同步改变状态还是异步改变状态,Promise.all 的执行结果都是有序的。正常来说异步执行时,结果应该是"222"、"333"、"111",因为resolve("111")是异步任务,在最后执行,他们三个的执行顺序应该是 p2–>p3–>p1。可是显示的结果却是 p1–>p2–>p3,这是为什么呢?

其实,关键点在于异步改变状态时,如何让 Promise.all 的执行结果变为有序的?很简单,在这里使用数组的下标赋值法arr[1] = "222"; arr[2] = "333"; arr[0] = "111"。这样得到的结果肯定是按顺序的 ["111", "222", "333"] ,因为根据数组下标来进行赋值操作时,就跟代码的执行顺序无关了。

let arr = new Array(3);  // 创建 length 为3的空数组 arr
arr[1] = 222;
console.log(arr);
arr[2] = 333;
console.log(arr);
arr[0] = 111;
console.log(arr);

在这里插入图片描述

Promise.all 方法封装的代码

Promise.all = function(promiseArray){return new Promise((resolve, reject) => {// 定义 Promise.all 方法的返回值let arr = [];// 循环处理 promise 对象for(let i = 0; i < promiseArray.length; i++){let p = promiseArray[i];// 调用每一个 promise 对象的 then 方法,获取结果p.then((value) => {// 根据数组下标赋值,保证 promise 对象返回正确的结果arr[i] = value;// 判断是否所有的 promise 对象都执行完毕,若全部执行完毕,则返回结果if (arr.length === promiseArray.length) {resolve(arr);}			}, reason => {// 状态变为失败时,直接返回结果reject(reason);})}})
}

相关内容

热门资讯

cocosCreator入门 ... 简介 cocosCreator的通过Dashboard来使用,它是cocosCreat...
k8s--kubernetes... 文章目录一、Metrics-Server1.Metrics-Server部署2.测试二、Dashbo...
如果回忆容易我会想你念你什么歌... 如果回忆容易我会想你念你什么歌 目录如果回忆容易我会想你念你什么歌 想你念你停止再继续是什么歌,沉醉...
梦网短信是什么意思,梦网短信是... 梦网短信是什么意思目录梦网短信是什么意思梦网短信是什么?什么叫梦网、网内、网外短信?梦网短信是什么意...
argparse模块的学习 📙本文参考于:argparse --- 命令行选项、参数和子命令解析器...
爱情公寓4曾小贤和胡一菲接吻是... 爱情公寓4曾小贤和胡一菲接吻是哪集 目录爱情公寓4曾小贤和胡一菲接吻是哪集 曾小贤在《爱情公寓4》吻...
求类似冰峰魔恋类小说 ,求类似... 求类似冰峰魔恋类小说 目录求类似冰峰魔恋类小说 求类似冰封魔恋之类的小说求类似爱你是我做过最好的事,...
Linux操作系统进程同步的几... 1,进程同步的几种方式1.1信号量用于进程间传递信号的一个整数值。在信号量上只有三种操...
Mac电脑搞自动化浏览器总是自... mac电脑下载更新谷歌驱动,配置环境变量之类的,我在其他博文中有提到&#...
唤醒手腕 TCP/IP 协议进... 访问域名的 IP 地址,User-Agent(一般是指浏览器࿰...
lj是什么意思 ,lj是什么意... lj是什么意思 目录lj是什么意思 lj是什么意思啊?lj是什么意思啊lj是什么意思 “LJ”是“垃...
皇家御河游(皇家御河游门票价格... 本篇文章极速百科给大家谈谈皇家御河游,以及皇家御河游门票价格对应的知识点,希望对各位有所帮助,不要忘...
佳木斯机票(深圳到佳木斯机票)... 今天给各位分享佳木斯机票的知识,其中也会对深圳到佳木斯机票进行解释,如果能碰巧解决你现在面临的问题,...
常州恐龙园票价(常州恐龙园票价... 本篇文章极速百科给大家谈谈常州恐龙园票价,以及常州恐龙园票价好贵对应的知识点,希望对各位有所帮助,不...
用 docker 创建 jme... 目录:导读 用 docker 创建 jmeter 容器, 实现性能测试 用docker...
二、Java并发编程之Reen... B站黑马课程 文章目录4. AQS4.1 锁的活跃性死锁哲学家就餐问题活锁饥饿4.2 AQS4.3...
23联防和32联防区别 ,篮球... 23联防和32联防区别 目录23联防和32联防区别 篮球的23联防和32联防有什么区别吗23联防和3...
什么边野草花什么口夕阳斜 ,什... 什么边野草花什么口夕阳斜 目录什么边野草花什么口夕阳斜 什么雀桥边野草花什么衣巷口夕阳斜什么边野草花...
迷雾电影结局是什么,电影《迷雾... 迷雾电影结局是什么目录迷雾电影结局是什么电影《迷雾》的结局是什么?迷雾这部电影的结局怎么样迷雾结局是...
捕鼠记有没有国语版的 ,捕鼠记... 捕鼠记有没有国语版的 目录捕鼠记有没有国语版的 捕鼠记 国语各位谁有 捕鼠记国语 谢谢了电影《捕鼠记...
java Vector 源码分... Vector类的底层实现Vector类 VS ArrayList类Vector类源码解读无参构造——...
Spring Cloud Ne... Ribbon是什么 Ribbon是Spring Cloud Netflix实现客户端负载均衡的技术...
【Ribbon与OpenFei... Ribbon与OpenFeign的超时设置(解决RetryableException: Read t...
爱情公寓开天辟地是第几集 ,爱... 爱情公寓开天辟地是第几集 目录爱情公寓开天辟地是第几集 爱情公寓里擎天柱之开天劈地游戏是哪集爱情公寓...
宁波到成都火车票(宁波到成都火... 今天给各位分享宁波到成都火车票的知识,其中也会对宁波到成都火车票查询进行解释,如果能碰巧解决你现在面...
下水道里的美人鱼 ,下水道的美... 下水道里的美人鱼 目录下水道里的美人鱼 下水道的美人鱼电影主要讲述的是什么?下水道的美人鱼讲的是什么...
【深度强化学习】(7) SAC... 大家好,今天和各位分享一下 SAC (Soft Actor Critic) 算法&#x...
【Linux】文件目录操作指令... 目录1 指定运行级别1.1 基本介绍1.2 应用实例2 帮助指令2.1 man获得帮助信息2.2 h...
【Java进阶篇】—— 多线程 一、基本概念 🌔1、我们首先要理解什么是程序、进程和线程? 程序(pr...
画时圆写时方冬时短夏时长是什么... 画时圆写时方冬时短夏时长是什么 目录画时圆写时方冬时短夏时长打一字写时方,画时圆,冬天短,夏天长,是...