en rask introduksjon til» Promises «og» Async / Await»(med nye funksjoner)
et løfte er en forekomst (objekt) av Promise
klasse (konstruktør). For å lage et løfte bruker vinew Promise(executor)
syntaks og gir en eksekutorfunksjon som argument. Denne byrder funksjonen gir et middel til å kontrollere oppførselen til vårt løfte oppløsning eller avvisning.
I TypeScript kan vi gi datatypen til verdien som returneres når løftet oppfyller. Siden feilen returnert av løftet kan ta noen form, standard datatype verdi returneres når løftet er avvist er satt til any
Av TypeScript.
for å annotere oppløsningsverditypen for løftet, bruker vi en generisk typedeklarasjon. I utgangspunktet lover du en type med Promise
konstruktør i form av new Promise<Type>()
som indikerer løst verditype av løftet. Men du kan også brukelet p: Promise<Type> = new Promise()
syntaks for å oppnå det samme.
💡 vi har diskutert generikk klasser i detalj I Generikk leksjonen.
i eksemplet ovenfor erfindEven
et løfte som ble opprettet ved hjelp avPromise
konstruktør som løser etter 1 sekund. Den løste datatypen for dette løftet er number
, derfor Vil typescript-kompilatoren ikke tillate deg å ringe resolve
funksjon med en annen verdi enn en verdi av typenummernumber
.
standardtypen for løftets avvisningsverdi er any
, derfor kaller reject
funksjon med hvilken som helst verdi er lovlig. Dette er Standard oppførsel Av TypeScript, og du kan finne diskusjonstråden her hvis du har dine egne meninger.
Siden vi har gitt number
som datatypen for vellykket løfteoppløsning, Vil typescript-kompilatoren gi number
typen til argumentet for value
argumentet for then
div > tilbakeringing metode.
tilbakeringing gitt ithen
metoden utføres når løftet er løst og tilbakeringing gitt i catch
metoden utføres når den avviser eller noen feil mens løse løftet. finally
– metoden registrerer en tilbakeringing som utføres når promise enten løser eller avviser.
hvis TypeScript-kompilatoren klager overfinally
– metoden, betyr Det At TypeScript-kompilatoren ikke importerer typedefinisjoner forfinally
– metoden. Denne metoden ble introdusert I ES2016, derfor er den ganske ny. Andre funksjoner I Promise API som brukes i denne leksjonen er ganske nye, så sørg for attsconfig.json
– filen har alle de nye bibliotekene lastet inn.
I mintsconfig.json
har jeg lastet ES2020
standardbibliotek. Dette gir støtte for Alle JavaScript-funksjonen FREM TIL ES2020. Hvis du vil vite mer om tsconfig.json
fil-eller standardbiblioteker, vennligst les Kompileringsleksjonen (kommer snart).
Promise Chaining
then
catch
og finally
metoder returnerer et løfte implisitt. Enhver verdi som returneres av disse tilbakeringingsfunksjonene, pakkes med et løfte og returneres, inkludert undefined
. Dette implisitte løftet er løst som standard med mindre du bevisst returnerer et nytt løfte fra disse metodene som kan mislykkes.
Derfor kan du legge til then
catch
eller finally
metoder til noen av de forrige then
catch
eller finally
metode. Hvis et implisitt løfte returneres med en av disse metodene, er den løste verditypen for dette implisitte løftet typen av den returnerte verdien. La oss se et raskt eksempel.
Vi har endret det forrige eksemplet og lagt til en annenthen
metode til den førstethen
metode. Siden den førstethen
metoden returnerer en verdi av typen string
, vil det implisitte løftet returnert av denne metoden bli løst med en verdi av typen string
. Derfor vil den andre then
metoden motta value
argument av typen string
som du kan se fra resultatene.
Løfte.løs
resolve
statisk metode forPromise
– anropet returnerer et løfte som allerede er løst med en verdi som du oppgir iPromise.resolve(value)
– anropet. Dette er enklere enn å opprette en ny forekomst Av Løftet samtalen og legge logikk for å løse løftet umiddelbart.
som du kan se av resultatene ovenfor, løftet returnert av Promise.resolve(value)
samtalen løser alltid umiddelbart med en number
verdi siden value
argumentet har typen number
.
Løfte.avvis
I Likhet medPromise.resolve
statisk metode, returnererPromise.reject(error)
metoden alltid et avvist løfte. Verdien av løftet avvisning er hentet fra argumenteterror
og dens type er any
.
den type løfte returnert avPromise.reject
metoden erPromise<never>
fordi dette løftet aldri løser, så det vil ikke være noen løfte oppløsning verdi. Derfor er typen av verdien løst av løftet never
som never
betyr verdien som aldri oppstår.
Løfte.alle
i noen scenarier har du å gjøre med flere løfter. Hvis du vil utføre en tilbakeringingsfunksjon når alle løftene er løst, brukPromise.all
statisk metode.
var pAll = Promise.all()pAll.then( ( ) => {___});
Promise.all
metoden tar en matrise (iterable presist) av løfter og returnerer et nytt løfte. Det returnerte løftet pAll
er løst når alle løfter p1, p2, ...
er løst. Dette løftet er løst med en matriseverdi som inneholder løfteoppløsningsverdiene for p1, p2, ...
i rekkefølgen av utseendet.
som du kan se fra eksempelet ovenfor, Promise.all
metoden er generisk og det tar typen verdien løst av hvert løfte gitt til den. Å gi en generisk type er ganske nyttig når vi bruker den løste verdien av dette kollektive løftet som du kan se fra resultatet ovenfor.
💡 De fleste statiske metodene i
Promise
klassen er generiske som vist i eksemplene nedenfor.
Det er en advarsel med Promise.all
. Det implementerer fail-fast mekanisme som betyr at hvis noen av inngangs løfterp1, p2, ...
er avvist,pAll
er avvist. Hvis vil ikke vente på andre ventende løfter å løse.
som du kan se av resultatet ovenfor, da 3. løfte ble avvist like etter 1 sekund, bleallPromise
avvist umiddelbart.
Løfte.allSettled
Promise.allSettled
statisk metode ligner Promise.all
, men i motsetning til Promise.all
, venter den til alle løftene er avgjort(som betyr til de løst eller avvist). Derfor vil løftet returnert av Promise.allSettled
aldri avvise (men vi har lagt tilcatch
blokk i eksempelet nedenfor uansett).
Arbeide medpromise.allSettled
kan være litt overveldende som du kan fra programmet ovenfor og resultatet. Først av alt returnerer allSettle
metode et løfte som løser med en rekkePromiseSettledResult<type>
verdier når alle løfter er avgjort. type
er avledet fra typen inndataløftet. PromiseSettledResult
typen ser ut som nedenfor.
disse typene er levert Av TypeScript standard bibliotek. Så når et løfte løser ,konvertererallSettled
metoden sin verdi til PromiseFulfilledResult
form og når den mislykkes, konverterer den den til PromiseRejectedResult
form. Det er derfor når allSettled
er løst, er det en rekke objekter der hvert objekt har en form av PromiseFulfilledResult
eller PromiseRejectedResult
grensesnitt.
Siden PromiseFulfilledResult
er en union av PromiseFulfilledResult
og PromiseRejectedResult
som har felles status
egenskap av bokstavelig datatype, kan vi bruke den som en diskriminant i switch/case
vakt.
💡 vi har snakket om
switch/case
skriv vakt og diskriminerende fagforeninger i Typesystemet leksjon.
Løfte.race
denPromise.race
tar en matrise (iterable presist) av løfter og returnerer et nytt løfte som løser eller avviser så snart en av inngangs løfter løser eller avviser. Med andre ord, løftet returnert av Promise.race
avgjøres med resultatet av et av inngangs løftene som avgjøres raskt.
I Motsetning til Promise.all
eller Promise.allSettled
, returnerer denne metoden bare en enkelt verdi av det første avgjorte løftet, derfor er typen av det returnerte løftet Promise<number>
i ovennevnte tilfelle. Siden 1st promise slo seg først blant andre, blir then
tilbakeringing av fastestPromise
kalt etter 500ms med verdien av det løste løftet.
💡 den nye
Promise.any()
metoden har nådd Trinn 4 I ecmascript-forslagssporet.Promise.any
er mye somPromise.race
men det venter til det første løftet er vellykket løser. Denne metoden kaster etAggregateError
unntak hvis alle løftene blir avvist.