JavaScript Løfter

Introduktion til løfter

Et løfte er almindeligvis defineret som en proxy for en værdi, der i sidste ende vil blive tilgængelige.løfter er en måde at håndtere asynkron kode uden at sidde fast i callback hell.

løfter har været en del af sproget i årevis (standardiseret og introduceret i ES2015) og er for nylig blevet mere integreret med async og venter i ES2017.,

Async funktioner bruger lover bag kulisserne, så forståelsen af, hvordan de løfter arbejde er grundlæggende for at forstå, hvordan async og await arbejde.

hvordan løfter fungerer, kort

Når et løfte er blevet kaldt, starter det i en verserende tilstand. Dette betyder, at opkaldsfunktionen fortsætter med at udføre, mens løftet afventer, indtil det løser, hvilket giver opkaldsfunktionen, uanset hvilke data der blev anmodet om.,

det oprettede løfte vil til sidst ende i en løst tilstand eller i en afvist tilstand ved at kalde de respektive tilbagekaldsfunktioner (overført til thenog catch) efter afslutning.

hvilke JS API ‘ er bruger løfter?

I tillæg til din egen kode og biblioteker kode, lover, at der anvendes af almindelige, moderne Web-Api ‘ er såsom:

  • Batteriet API
  • Hente API
  • servicemedarbejdere

Det er usandsynligt, at der i moderne JavaScript-vil du finde dig selv ikke ved hjælp af løfter, så lad os begynde at dykke lige ind i dem.,

Oprettelse af et løfte

Det Løfte, API udsætter et Løfte konstruktør, som du initialisere ved hjælp af new Promise():

Som du kan se, at det løfte, der kontrollerer done global konstant, og hvis det er sandt, løftet går på, at en løsning for staten (siden resolve tilbagekald blev kaldt); ellers reject tilbagekald er gennemført, til at sætte det løfte, i en afvist stat., (Hvis ingen af disse funktioner kaldes i den sti, den lover, vil forblive i en afventende tilstand)

ved Brug af resolve og reject, som vi kan kommunikere tilbage til den, der ringer, hvad den resulterende løfte tilstand var, og hvad de skal gøre med det. I ovenstående tilfælde returnerede vi lige en streng, men det kunne være et objekt, eller null også. Fordi vi har oprettet løftet i ovenstående uddrag, er det allerede begyndt at udføre. Dette er vigtigt at forstå, hvad der foregår i afsnittet forbruge et løfte nedenfor.,

et mere almindeligt eksempel, Du kan komme på tværs af, er en teknik kaldet Promisifying. Denne teknik er en måde at være i stand til at bruge en klassisk JavaScript-funktion, der tager en tilbagekaldsanmodning, og har det til gengæld et løfte:

I de seneste versioner af Node.js, du behøver ikke at gøre denne manuelle konvertering for en masse af API. Der er en promisifying-funktion Tilgængelig i UTIL-modulet, der vil gøre dette for dig, da den funktion, du lover, har den rigtige signatur.,

forbruger et løfte

i det sidste afsnit introducerede vi, hvordan et løfte oprettes.lad os nu se, hvordan løftet kan forbruges eller bruges.

Kører checkIfItsDone() vil angive funktioner til at udføre, når isItDoneYet lover løser (i then opkald) eller afviser (i catch opkald).

kæde løfter

et løfte kan returneres til et andet løfte, hvilket skaber en kæde af løfter.,

et godt eksempel på kæde løfter er Fetch API, som vi kan bruge til at få en ressource og kø en kæde af løfter til at udføre, når ressourcen er hentet.

Hent API ‘ en er en promise-baseret mekanisme, og at kalde fetch()svarer til at definere vores eget løfte ved hjælp af new Promise().

Eksempel på kæde løfter

I dette eksempel, vi kalder fetch() for at få en liste af TODO-emner fra todos.json fil, der findes i domænet rod, og vi skaber en kæde af løfter.,

Kører fetch() returnerer et svar, som har mange egenskaber, og inden for dem, vi reference:

  • status, en numerisk værdi, som repræsenterer HTTP status code
  • statusText, en statusbesked der er OK hvis anmodningen er lykkedes

response har også en json() metode, som returnerer et løfte, der vil løse med indhold af kroppen behandlet og omdannet til JSON.,

Så i betragtning af disse lokaler, dette er hvad der sker: den første løfte i kæden er en funktion, som vi definerede, kaldet status(), der kontrollerer svar-status, og hvis det ikke er en succes svar (mellem 200 og 299), afviser den lover.

Denne operation, vil medføre, at løfte kæden til at springe alle lænket løfter, der er opført og vil springe direkte til den catch() erklæring i bunden, logge Request failed tekst sammen med fejlmeddelelsen.,

Hvis det lykkes i stedet, kalder det json() funktion, vi definerede. Da det forrige løfte, når det lykkedes, returnerede response objekt, får vi det som et input til det andet løfte.

i dette tilfælde returnerer vi dataene JSON behandlet, så det tredje løfte modtager JSON direkte:

.then((data) => { console.log('Request succeeded with JSON response', data)})

og vi logger det simpelthen på konsollen.

håndteringsfejl

i eksemplet i det foregående afsnit havde vi encatch, der blev tilføjet løfterkæden.,

Når noget i kæden af løfter fejler og rejser en fejl eller afviser løftet, går kontrollen til nærmeste catch() erklæring ned ad kæden.

Kaskadefejl

Hvis du inde i catch()hæver en fejl, kan du tilføje et sekund catch() for at håndtere det og så videre.

new Promise((resolve, reject) => { throw new Error('Error')}) .catch(err => { throw new Error('Error') }) .catch(err => { console.error(err) })

orkestrerende løfter

løfte.,alle ()

Hvis du har brug for at synkronisere forskellige løfter, hjælper Promise.all() dig med at definere en liste over løfter og udføre noget, når de alle er løst.

Eksempel:

ES2015 destruktureringsdeklaration opgaven syntaks kan du også gøre

Promise.all().then(() => { console.log('Results', res1, res2)})

Du er ikke begrænset til, brug af fetch selvfølgelig, enhver løfte, der kan bruges på denne måde.

løfte.,race()

Promise.race() kører, når den første af de løfter, du videregiver til det løser, og det kører vedlagte tilbagekald bare én gang, med resultatet af den første løfte løst.,

Eksempel:

mest Almindelige fejl

Fanget TypeError: udefineret er ikke et løfte

Hvis du får Uncaught TypeError: undefined is not a promise fejl i konsollen, sørg for at bruge new Promise() i stedet for Promise()

UnhandledPromiseRejectionWarning

Dette betyder, at et løfte, du har ringet afvist, men der var ingen catch, der bruges til at håndtere fejl. Tilføj en catch efter den krænkende then for at håndtere dette korrekt.

Share

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *