Promise-klassen i JavaScript
I denne artikkelen forklarer vi Promise-klassen i JavaScript.
YouTube Video
Promise
Promise-klassen er en klasse for håndtering av asynkrone operasjoner. Den håndterer resultater hvis operasjonen lykkes, eller feilbehandling hvis den mislykkes. Tradisjonelt ble callback-funksjoner brukt når man måtte vente på at en asynkron operasjon skulle fullføres, men Promise gjør dette tydeligere og mer kraftfullt.
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 koden er et eksempel på en asynkron prosess som viser "Ferdig!" etter ett sekund.
- Først opprettes et nytt
Promise-objekt ved å brukenew Promise. Argumentet er en funksjon som tar to tilbakekall:resolvefor suksess ogrejectfor feil. setTimeoutbrukes for å kalleresolve()etter ett sekund.then()-metoden tilpromise-objektet venter på fullføring og viser resultatet.
- Først opprettes et nytt
Grunnleggende Struktur
Et Promise er et objekt som til slutt resulterer i enten suksess eller feil.
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 tilfelle suksess blir
resolve()kalt. - I tilfelle feil blir
reject()kalt.
Promise-objektet har tre tilstander.
1promise
2 .then((result) => {
3 console.log(result);
4 })
5 .catch((error) => {
6 console.error(error);
7 })- Venter
- Den asynkrone prosessen er ikke fullført ennå.
- Fullført
- Den asynkrone prosessen var vellykket, og resultatet ble returnert av
resolve(). Resultatet mottas ved hjelp avthen()-metoden.
- Den asynkrone prosessen var vellykket, og resultatet ble returnert av
- Avvist
- Den asynkrone prosessen mislyktes, og en feil oppstod via
reject(). Feilen mottas ved hjelp avcatch()-metoden.
- Den asynkrone prosessen mislyktes, og en feil oppstod via
then()- og catch()-metoder
Ved bruk av en Promise kan du definere hva som skal gjøres når en asynkron operasjon fullføres. Til dette bruker du metodene 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 spesifiserer en funksjon som skal kalles 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 spesifiserer en funksjon som skal kalles nårPromisemislykkes.
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 som vil bli utført til slutt uavhengig av omPromiselyktes eller mislyktes.
then()-kjede
then() returnerer et nytt Promise, så du kan kjedekoble neste 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 koden sender den første
resolve()verdien 1, og hver verdi som returneres av enthen, sendes til nestethen. - Ved å bruke
catch()kan du håndtere enhver feil som oppstår i kjeden på ett sted.
Praktisk eksempel
For eksempel brukes ofte Promises til å hente data fra en server. La oss se på et eksempel ved å bruke 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 koden, siden
fetch()returnerer enPromise, brukesthen()til å behandle dataene etter å ha mottatt et svar fra serveren. Feil håndteres medcatch().
Håndtering av flere Promises
Promise.all()
For å kjøre flere Promises samtidig og bare gå videre hvis alle lykkes, bruk 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()kalles kun hvis allePromiseslykkes.catch()kalles hvis til og med én feiler.
Promise.allSettled()
Hvis du vil kjøre flere Promise samtidig og få alle resultater uavhengig av suksess eller feil, bruk 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()kalles når allePromiseer ferdigbehandlet (enten oppfylt eller avslått). Hvert resultat inkluderer enstatus-egenskap ('fulfilled'eller'rejected'). Selv om noen feiler, påvirker det ikke de andre operasjonene.
Promise.race()
Promise.race() returnerer resultatet til den Promise som avgjøres først, enten den blir oppfylt eller avvist.
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 eksempelet returneres resultatet fra den første ferdige
Promise.
Forholdet mellom async/await
Ved å bruke syntaksen async/await kan du skrive Promises mer intuitivt. En async-funksjon returnerer alltid en Promise, og await venter på at Promise skal fullføres.
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 å bruke async/await på denne måten kan asynkrone operasjoner skrives som synkrone koder, noe som gjør det lettere å lese.
Sammendrag
Promiseer et objekt for å håndtere suksess eller feil ved asynkrone operasjoner.- Håndter vellykkede operasjoner med
then()og feil medcatch(). finally()definerer kode som kjøres til slutt, uavhengig av suksess eller feil.- Du kan håndtere flere
Promisessammen ved å brukePromise.all()ellerPromise.race(). async/awaiter en syntaks for å skrivePromisesenklere.
Du kan følge med på artikkelen ovenfor ved å bruke Visual Studio Code på vår YouTube-kanal. Vennligst sjekk ut YouTube-kanalen.