Handgeschriebenes Versprechen, Prinzipreihe acht: Kapselung der Promise.all-Methode, Verwendung von Promise.all

Fügen Sie hier eine Bildbeschreibung ein

Hallo Freunde, die „Handwriting Promise Principles Series“ geht bald zu Ende und ich habe vor, sie mit „Handwriting Promise Principles Series 9“ zu beenden.

Warum in Serie 9 herauskommen? Wahrscheinlich wegen der Nummer neun! In der traditionellen chinesischen Kultur ist „zehn“ die Zahl des Überflusses. Wenn die Dinge ihren Höhepunkt erreichen, kippen sie ins Extreme und verfallen, also sollten wir damit vorsichtig sein; und „neun“ ist ein Schritt vorwärts für dreißig Meter und Wir hoffen, dass wir auf dreißig Meter klettern können. Gehen Sie noch einen Schritt weiter. Neun ist auch die Anzahl der Pole und die Anzahl des Yang; im Buch der Wandlungen verwendet die Yang-Linie (Yao) neun, die Yin-Linie sechs und das Qian-Hexagramm besteht aus sechs Yang-Linien. Die „Elefantenbiographie“ definiert das Qian-Hexagramm als: Der Himmel bewegt sich energisch und ein Gentleman strebt danach, ständig nach Selbstverbesserung zu streben.

Lassen Sie uns abschweifen und zum Thema zurückkehren.

Das aktuelle Kapitel befasst sich mit der Verwendung und Kapselung der Promise.all-Methode.

Aus der Definition des Wortes all können wir erkennen, dass es 全部 bedeutet. Tatsächlich wird das Ergebnis nur zurückgegeben, wenn alle Versprechensobjekte vorhanden sind erfolgreich ausgeführt. Solange einer fehlschlägt, wird ein fehlgeschlagenes Ergebnis zurückgegeben.

Schauen wir uns zunächst die Methode des fehlgeschlagenen Aufrufs an:

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);

Fügen Sie hier eine Bildbeschreibung ein
Der Parameter der Promise.all-Methode ist ein Array von Promise-Objekten. Wenn in den Parametern der Promise.all-Methode ein Fehlerstatus vorliegt, werden der Status und das Ergebnis des aktuellen fehlgeschlagenen Promise-Objekts direkt zurückgegeben.

Schauen wir uns die aufrufende Methode für eine erfolgreiche synchrone Ausführung an:

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);

Fügen Sie hier eine Bildbeschreibung ein

Es gibt auch eine Aufrufmethode für eine erfolgreiche asynchrone Ausführung:

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);

Fügen Sie hier eine Bildbeschreibung ein
Aus den oben genannten synchronen und asynchronen Aufrufmethoden geht hervor, dass das Ausführungsergebnis von Promise.all unabhängig davon, ob das Promise-Objekt seinen Zustand synchron oder asynchron ändert, geordnet. Warum ist das so? p1–>p2–>p3. Aber das angezeigte Ergebnis ist p2–>p3–>p1 eine asynchrone Aufgabe ist und am Ende ausgeführt wird. Die Ausführungsreihenfolge der drei sollte sein sein "222"、"333"、"111" sein, da . Normalerweise sollte das Ergebnis bei asynchroner Ausführung resolve("111")

Tatsächlich besteht der entscheidende Punkt darin, wie die Ausführungsergebnisse von Promise.all geordnet werden, wenn der Status asynchron geändert wird. Es ist ganz einfach, hier verwendet die Array-Index-Zuweisungsmethode , arr[1] = "222"; arr[2] = "333"; arr[0] = "111". Das auf diese Weise erhaltene Ergebnis muss in der richtigen Reihenfolge sein ["111", "222", "333"], denn wenn die Zuweisungsoperation basierend auf dem Array-Index ausgeführt wird, hat dies nichts mit der Ausführungsreihenfolge des Codes zu tun.

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);

Fügen Sie hier eine Bildbeschreibung ein

Von der Promise.all-Methode gekapselter Code:

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);
			})
		}
	})
}

Supongo que te gusta

Origin blog.csdn.net/ThisEqualThis/article/details/129499025
Recomendado
Clasificación