Promises im synchronen Stil in JavaScript
Um das Problem des Promise Hells zu lösen, wurde eine besondere Syntax für Promises erfunden, die es erlaubt, asynchronen Code viel einfacher zu schreiben - im synchronen Stil.
Lasst uns mit seinem Studium beginnen. Nehmen wir zunächst den Code aus der vorherigen Lektion:
function func() {
getSmth(2).then(res => {
console.log(res); // gibt 4 aus
});
}
func();
Wenn unsere Funktion getSmth synchron wäre,
dann könnten wir den Code der Funktion func
wie folgt umschreiben:
function func() {
let res = getSmth(2);
console.log(res); // gibt 4 aus
}
Die Funktion getSmth ist jedoch asynchron,
daher wird der obige Code nicht funktionieren.
Aber indem wir den synchronen Stil von Promises nutzen,
können wir etwas Ähnliches erreichen. Tun wir das.
Zuerst müssen wir unsere Funktion
func als asynchron mit Hilfe des speziellen
Befehls async deklarieren:
async function func() {
}
Danach können wir innerhalb der Funktion func
den speziellen Befehl await verwenden.
Dieser Befehl, geschrieben vor einem Promise, zwingt
JavaScript zu warten, bis das Promise
erfüllt ist. Danach gibt der Befehl das
Ergebnis des Promises zurück, und die Codeausführung wird fortgesetzt.
In unserem Fall müssen wir await
vor dem Aufruf von getSmth schreiben. Da das Ergebnis
des Aufrufs dieser Funktion ein Promise ist, wird die weitere
Ausführung des Codes nur nach der
Erfüllung dieses Promises fortgesetzt. Nun, und das Ergebnis
des Promises kann in eine Variable geschrieben werden. Setzen wir
das Beschriebene um:
async function func() {
let res = await getSmth(2);
console.log(res); // gibt 4 aus
}
func();
Lasst uns getSmth mehrmals aufrufen:
async function func() {
let res1 = await getSmth(2);
let res2 = await getSmth(3);
console.log(res1 + res2); // gibt 13 aus
}
func();
Und jetzt rufen wir getSmth in einer Schleife auf:
async function func() {
let arr = [1, 2, 3, 4, 5];
let sum = 0;
for (let elem of arr) {
sum += await getSmth(elem);
}
console.log(sum);
}
func();
Schreiben Sie den folgenden Code durch die synchrone Syntax um:
function func() {
getSmth(2).then(res1 => {
getSmth(3).then(res2 => {
getSmth(4).then(res3 => {
console.log(res1 + res2 + res3);
});
});
});
}
func();