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 then
og 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 erOK
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.