Promise-klassen i JavaScript
I denne artikel forklarer vi Promise-klassen i JavaScript.
YouTube Video
Promise
Promise-klassen er en klasse til håndtering af asynkrone operationer. Den håndterer resultater, hvis operationen lykkes, eller fejlbehandling, hvis den fejler. Traditionelt blev callback-funktioner brugt, når man skulle vente på, at en asynkron operation blev færdig, men Promise gør dette mere klart og kraftfuldt.
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));- Denne kode er et eksempel på en asynkron proces, der viser "Færdig!" efter ét sekund.
- Først oprettes et nyt
Promise-objekt ved hjælp afnew Promise. Argumentet er en funktion, der tager to callbacks:resolvefor succes ogrejectfor fejl. setTimeoutbruges til at kalderesolve()efter ét sekund.then()-metoden påpromise-objektet venter på afslutning og viser resultatet.
- Først oprettes et nyt
Grundlæggende Struktur
En Promise er et objekt, der til sidst resulterer i enten succes eller fejl.
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});- I tilfælde af succes kaldes
resolve(). - I tilfælde af fejl kaldes
reject().
Promise-objektet har tre tilstande.
1promise
2 .then((result) => {
3 console.log(result);
4 })
5 .catch((error) => {
6 console.error(error);
7 })- Afventer
- Den asynkrone proces er endnu ikke afsluttet.
- Opfyldt
- Den asynkrone proces lykkedes, og resultatet blev returneret af
resolve(). Resultatet modtages ved hjælp afthen()-metoden.
- Den asynkrone proces lykkedes, og resultatet blev returneret af
- Afvist
- Den asynkrone proces mislykkedes, og en fejl opstod via
reject(). Fejlen modtages ved hjælp afcatch()-metoden.
- Den asynkrone proces mislykkedes, og en fejl opstod via
then()- og catch()-metoder
Med et Promise kan du definere, hvad der skal gøres, når en asynkron operation er fuldført. Til dette bruger du metoderne then() og catch().
then()
1const promise = new Promise((resolve, reject) => {
2 resolve('Operation successful!');
3});
4
5promise.then((result) => {
6 console.log(result); // "Operation successful!"
7});then()-metoden specificerer en funktion, der skal kaldes, nårPromiselykkes.
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});catch()-metoden specificerer en funktion, der skal kaldes, nårPromisefejler.
finally()-metoden
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 });finally()-metoden definerer kode, der vil blive eksekveret til sidst, uanset omPromiselykkedes eller fejlede.
then()-kæde
then() returnerer en ny Promise, så du kan kæde den næste then().
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 });- I denne kode videresender den første
resolve()værdien 1, og hver værdi, der returneres af enthen, sendes videre til den næstethen. - Ved at bruge
catch()kan du håndtere enhver fejl, der opstår i kæden, ét sted.
Praktisk Eksempel
For eksempel bruges Promises ofte til at hente data fra en server. Lad os se på et eksempel med fetch() API'et.
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 });- I denne kode, da
fetch()returnerer enPromise, brugesthen()til at behandle data, efter at der er modtaget et svar fra serveren. Fejl håndteres ved hjælp afcatch().
Håndtering af Flere Promises
Promise.all()
For at udføre flere Promises samtidigt og kun fortsætte, hvis alle lykkes, brug 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()kaldes kun, hvis allePromiseslykkes.catch()kaldes, hvis blot én fejler.
Promise.allSettled()
Hvis du vil køre flere Promises samtidigt og få alle resultater uanset om de lykkes eller fejler, skal du bruge 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()bliver kaldt, når allePromises er afgjort (enten opfyldt eller afvist). Hvert resultat indeholder enstatus-egenskab ('fulfilled'eller'rejected'). Selv hvis nogle fejler, påvirker det ikke de andre operationer.
Promise.race()
Promise.race() returnerer resultatet af den Promise, der først bliver afklaret, uanset om den opfyldes eller afvises.
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});- Som i dette eksempel returneres resultatet af den første fuldførte
Promise.
Forholdet til async/await
Ved at bruge async/await syntaksen kan du skrive Promises mere intuitivt. En async funktion returnerer altid en Promise, og await venter på, at Promise afsluttes.
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();Ved at bruge async/await på denne måde kan asynkrone operationer skrives som synkron kode, hvilket gør det lettere at læse.
Sammendrag
Promiseer et objekt til håndtering af succes eller fejl i asynkrone operationer.- Håndter vellykkede operationer med
then()og fejl medcatch(). finally()definerer kode, der udføres til sidst, uanset om det lykkes eller ej.- Du kan håndtere flere
Promisessammen ved at brugePromise.all()ellerPromise.race(). async/awaiter en syntaks til at skrivePromisesmere enkelt.
Du kan følge med i ovenstående artikel ved hjælp af Visual Studio Code på vores YouTube-kanal. Husk også at tjekke YouTube-kanalen.