Promise-Klasse in JavaScript
In diesem Artikel erklären wir die Promise-Klasse in JavaScript.
YouTube Video
Promise
Die Promise
-Klasse ist eine Klasse zur Handhabung asynchroner Operationen. Sie verarbeitet Ergebnisse, wenn die Operation erfolgreich ist, oder führt Fehlerbehandlungen durch, wenn sie fehlschlägt. Traditionell wurden Callback-Funktionen verwendet, wenn man auf den Abschluss einer asynchronen Operation warten musste, aber Promise
macht dies klarer und leistungsfähiger.
1const promise = new Promise((resolve, reject) => {
2 setTimeout(() => resolve("Done!"), 1000);
3});
4
5// Displays "Done!" after 1 second
6promise.then(result => console.log(result));
- Dieser Code ist ein Beispiel für einen asynchronen Vorgang, der nach einer Sekunde "Fertig!" anzeigt.
- Zuerst wird ein neues
Promise
-Objekt mitnew Promise
erstellt. Das Argument ist eine Funktion, die zwei Callbacks entgegennimmt:resolve
für Erfolg undreject
für Fehlschlag. setTimeout
wird verwendet, um nach einer Sekunderesolve()
aufzurufen.- Die
then()
-Methode desPromise
-Objekts wartet auf den Abschluss und zeigt das Ergebnis an.
- Zuerst wird ein neues
Grundstruktur
Ein Promise
ist ein Objekt, das schließlich entweder mit Erfolg oder Fehlschlag endet.
1const promise = new Promise((resolve, reject) => {
2 // Asynchronous operation
3 // Flag indicating whether the operation was successful
4 const success = true;
5
6 if (success) {
7 resolve('Operation successful!');
8 } else {
9 reject('An error occurred');
10 }
11});
- Im Falle von Erfolg wird
resolve()
aufgerufen. - Im Falle von Fehlschlag wird
reject()
aufgerufen.
Ein Promise
-Objekt hat drei Zustände.
1promise
2 .then((result) => {
3 console.log(result);
4 })
5 .catch((error) => {
6 console.error(error);
7 })
- Ausstehend
- Der asynchrone Vorgang ist noch nicht abgeschlossen.
- Erfüllt
- Der asynchrone Vorgang war erfolgreich, und das Ergebnis wurde durch
resolve()
zurückgegeben. Das Ergebnis wird mit derthen()
-Methode empfangen.
- Der asynchrone Vorgang war erfolgreich, und das Ergebnis wurde durch
- Abgelehnt
- Der asynchrone Vorgang ist fehlgeschlagen, und ein Fehler trat über
reject()
auf. Der Fehler wird mit dercatch()
-Methode empfangen.
- Der asynchrone Vorgang ist fehlgeschlagen, und ein Fehler trat über
then()
- und catch()
-Methoden
Mit einem Promise
können Sie definieren, was zu tun ist, wenn eine asynchrone Operation abgeschlossen wird. Dafür verwendet man die Methoden then()
und catch()
.
then()
1const promise = new Promise((resolve, reject) => {
2 resolve('Operation successful!');
3});
4
5promise.then((result) => {
6 console.log(result); // "Operation successful!"
7});
- Die
then()
-Methode definiert eine Funktion, die aufgerufen wird, wenn dasPromise
erfolgreich ist.
catch()
1const promise = new Promise((resolve, reject) => {
2 reject('An error occurred');
3});
4
5promise.catch((error) => {
6 console.error(error); // "An error occurred"
7});
- Die
catch()
-Methode definiert eine Funktion, die aufgerufen wird, wenn dasPromise
fehlschlägt.
finally()
-Methode
1const promise = new Promise((resolve, reject) => {
2 resolve('Operation successful!');
3});
4
5promise
6 .then((result) => {
7 console.log(result);
8 })
9 .catch((error) => {
10 console.error(error);
11 })
12 .finally(() => {
13 console.log('The operation has completed');
14 });
- Die
finally()
-Methode definiert Code, der am Ende ausgeführt wird, unabhängig davon, ob dasPromise
erfolgreich war oder nicht.
then()
-Kette
then()
gibt ein neues Promise
zurück, sodass Sie das nächste then()
verketteln können.
1const promise = new Promise((resolve, reject) => {
2 setTimeout(() => {
3 resolve(1);
4 }, 1000);
5});
6
7promise
8 .then(result => {
9 console.log(result); // 1
10 return result + 1;
11 })
12 .then(result => {
13 console.log(result); // 2
14 return result + 1;
15 })
16 .then(result => {
17 console.log(result); // 3
18 })
19 .catch(error => {
20 console.error(error.message); // Something went wrong
21 });
- In diesem Code übergibt das anfängliche
resolve()
den Wert 1, und jeder von einemthen
zurückgegebene Wert wird an das nächstethen
weitergegeben. - Mit
catch()
können Sie jeden Fehler, der in der Kette auftritt, an einer Stelle behandeln.
Praktisches Beispiel
Zum Beispiel werden Promises
häufig verwendet, um Daten von einem Server abzurufen. Schauen wir uns ein Beispiel mit der fetch()
-API an.
1fetch('https://codesparklab.com/json/example.json')
2 .then(response => {
3 if (!response.ok) {
4 throw new Error('Network error');
5 }
6 return response.json();
7 })
8 .then(data => {
9 console.log(data);
10 })
11 .catch(error => {
12 console.error('Error:', error);
13 });
- In diesem Code wird
then()
verwendet, um die Daten zu verarbeiten, nachdem die Antwort vom Server eingegangen ist, dafetch()
einPromise
zurückgibt. Fehler werden mitcatch()
behandelt.
Verarbeitung mehrerer Promises
Promise.all()
Um mehrere Promises
gleichzeitig auszuführen und nur fortzufahren, wenn alle erfolgreich sind, verwenden Sie Promise.all()
.
1const promise1 = Promise.resolve(1);
2const promise2 = Promise.resolve(2);
3const promise3 = Promise.resolve(3);
4
5Promise.all([promise1, promise2, promise3])
6 .then((results) => {
7 console.log(results); // [1, 2, 3]
8 })
9 .catch((error) => {
10 console.error('Error :', error);
11 });
then()
wird nur aufgerufen, wenn allePromises
erfolgreich sind.catch()
wird aufgerufen, wenn auch nur eines fehlschlägt.
Promise.allSettled()
Wenn Sie mehrere Promise
s gleichzeitig ausführen und alle Ergebnisse unabhängig von Erfolg oder Misserfolg erhalten möchten, verwenden Sie Promise.allSettled()
.
1const promise1 = Promise.resolve(1);
2const promise2 = Promise.reject("Failed");
3const promise3 = Promise.resolve(3);
4
5Promise.allSettled([promise1, promise2, promise3])
6 .then((results) => {
7 results.forEach(result => console.log(result));
8 // [
9 // { status: 'fulfilled', value: 1 },
10 // { status: 'rejected', reason: 'Failed' },
11 // { status: 'fulfilled', value: 3 }
12 // ]
13 });
then()
wird aufgerufen, sobald allePromise
s abgeschlossen sind (entweder erfüllt oder abgelehnt). Jedes Ergebnis enthält einestatus
-Eigenschaft ('fulfilled'
oder'rejected'
). Selbst wenn einige fehlschlagen, beeinflusst das die anderen Operationen nicht.
Promise.race()
Promise.race()
gibt das Ergebnis des Promise
zurück, das zuerst abgeschlossen wird – egal ob erfüllt oder abgelehnt.
1const promise1 = new Promise((resolve) => setTimeout(resolve, 100, 'First'));
2const promise2 = new Promise((resolve) => setTimeout(resolve, 500, 'Second'));
3
4Promise.race([promise1, promise2]).then((result) => {
5 console.log(result); // "First"
6});
- Wie in diesem Beispiel wird das Ergebnis des zuerst erfüllten
Promise
zurückgegeben.
Beziehung zu async
/await
Mit der Syntax async
/await
können Sie Promises
intuitiver schreiben. Eine async
-Funktion gibt immer ein Promise
zurück, und await
wartet darauf, dass das Promise
abgeschlossen wird.
1async function fetchData() {
2 try {
3 const response = await fetch('https://codesparklab.com/json/example.json');
4 const data = await response.json();
5 console.log(data);
6 } catch (error) {
7 console.error('Error :', error);
8 }
9}
10
11fetchData();
Durch die Verwendung von async
/await
können asynchrone Operationen wie synchroner Code geschrieben werden, was die Lesbarkeit verbessert.
Zusammenfassung
Promise
ist ein Objekt zur Verarbeitung von Erfolg oder Misserfolg asynchroner Operationen.- Verarbeiten Sie erfolgreiche Operationen mit
then()
und Fehler mitcatch()
. finally()
definiert Code, der am Ende unabhängig von Erfolg oder Misserfolg ausgeführt wird.- Sie können mehrere
Promises
gemeinsam mitPromise.all()
oderPromise.race()
verarbeiten. async
/await
ist eine Syntax, umPromises
einfacher zu schreiben.
Sie können den obigen Artikel mit Visual Studio Code auf unserem YouTube-Kanal verfolgen. Bitte schauen Sie sich auch den YouTube-Kanal an.