手写promise原理系列八:封装Promise.all方法,Promise.all的用法

在这里插入图片描述

小伙伴们,你们好,“手写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);
			})
		}
	})
}

http://www.niftyadmin.cn/n/150162.html

相关文章

计算机二级Python备考(23年3月)(持续更新中)

目录 一、选择题 1.在Python语言中&#xff1a; 2.知识点 二、基本操作题 1. jieba库 考点知识点 &#xff1a; 题目1&#xff1a; 2. format格式化输出 考查知识点&#xff1a; 题目1&#xff1a; 3 random库 考察知识点&#xff1a;常考 题目1&#xff1a;import…

使用jemalloc检测内存泄露

一、安装jemalloc 1.1、下载源码 wget https://github.com/jemalloc/jemalloc/archive/refs/tags/5.3.0.tar.gz 1.2、解压源码包 tar -zxv -f 5.3.0.tar.gz 1.3、编译并安装 cd jemalloc-5.3.0 ./autogen.sh 在这个文件里面加上-configure后面-enable-prof参数 sudo make sudo…

企企通:采购方怕投标方串通“围标”,怎么办?电子招投标来帮你

大家都知道&#xff0c;在采购过程中&#xff0c;招投标是一个很重要的环节。传统的招投标过程中&#xff0c;虽然采供双方角色不一样&#xff0c;但面对的烦恼却是大同小异。采购方需要进行繁琐的手工操作&#xff0c;包括招标文件的印刷、邮寄、收发等步骤&#xff0c;供应商…

Python3时间戳转换为指定格式的日期

在写Python的时候经常会遇到时间格式的问题&#xff0c;首先就是最近用到的时间戳&#xff08;timestamp&#xff09;和时间字符串之间的转换。所谓时间戳&#xff0c;就是从 1970年1月1日 00:00:00 到现在的秒数。原来我也写过关于python3里面如何进行时间转换。在Python里&am…

2020蓝桥杯真题数位递增的数 C语言/C++

题目描述 一个正整数如果任何一个数位不大于右边相邻的数位&#xff0c;则称为一个数位递增的数。 例如 1135 是一个数位递增的数&#xff0c;而 1024 不是一个数位递增的数。 给定正整数 n&#xff0c;请问在整数 1 至n 中有多少个数位递增的数&#xff1f; 输入描述 输入的…

RocketMQ详解(一):RocketMQ架构详解

前言 MQ的三大特性&#xff1a; 1、异步解耦 上游系统对下游系统的调用如果是同步调用&#xff0c;则会大大降低系统的吞吐量与并发度&#xff0c;且系统间耦合度太高。而异步调用则会解决这些问题&#xff0c;一般做法就是&#xff0c;在两层间添加一个MQ层。 2、流量削峰 M…

Centos 7 安装系列(9):Minio (rpm 方式)

一、系统环境 操作系统&#xff1a;Centos 7 已配置环境&#xff1a;空 二、安装步骤 2.1 下载安装包 yum install -y wget mkdir /opt/minio wget https://dl.minio.org.cn/server/minio/release/linux-amd64/minio-20230210184839.0.0.x86_64.rpm minio.rpm2.2 安装并试运…

JavaEE简单示例——Spring的装配方式

简单介绍&#xff1a; 装配就是赋值的方式。装配&#xff0c;注入和赋值说的都是一回事&#xff0c;Spring的装配方式主要有三种&#xff0c;基于XML文件的装配&#xff0c;基于注解的装配和自动装配。我们主要讲解基于注解的装配和自动装配&#xff0c;基于XML文件的装配和之…