(tsconfig.JSON) i mitt tsconfig.json
har jag laddat ES2020
standardbibliotek. Detta ger stöd för alla JavaScript-funktionen fram till ES2020. Om du vill veta mer omtsconfig.json
fil eller standardbibliotek, läs Kompileringslektionen (kommer snart).
Promise Chaining
then
catch
ochfinally
metoder returnerar ett löfte implicit. Alla värden som returneras av dessa återuppringningsfunktioner lindas med ett löfte och returneras, inklusive undefined
. Detta implicita löfte löses som standard om du inte medvetet returnerar ett nytt löfte från dessa metoder som kan misslyckas.
därför kan du lägga till then
catch
eller finally
metoder till någon av de tidigare then
catch
eller finally
metod. Om ett implicit löfte returneras med en av dessa metoder, är den lösta värdetypen för detta implicita löfte typen av det returnerade värdet. Låt oss se ett snabbt exempel.
(löfte-kedja.ts)
Vi har ändrat föregående exempel och lagt till en annan then
metod till den första then
metod. Eftersom den första then
– metoden returnerar ett värde av typen string
, kommer det implicita löfte som returneras med denna metod att lösas med ett värde av typen string
. Därför kommer den andra then
metoden att få value
argument av typen string
som du kan se från resultaten.
löfte.lös
resolve
statisk metod förPromise
samtal returnerar ett löfte som redan har lösts med ett värde som du anger iPromise.resolve(value)
samtal. Det här är enklare än att skapa en ny instans av Promise-samtalet och lägga till logik för att lösa löftet omedelbart.
(löfte-lösa.ts)
som du kan se från ovanstående resultat löser löftet som returneras av Promise.resolve(value)
samtal alltid omedelbart med ett number
värde sedan value
argumentet har typen number
.
löfte.avvisa
i likhet medPromise.resolve
statisk metod returnerarPromise.reject(error)
metoden alltid ett avvisat löfte. Värdet på löfteavvisningen tas från argumentet error
och dess typ är any
.
(löfte-avvisa.ts)
den typ av löfte som returneras avPromise.reject
metoden ärPromise<never>
eftersom detta löfte aldrig löser sig, så det kommer inte att finnas något löftupplösningsvärde. Därför är typen av värdet som lösts av löftet never
som never
betyder det värde som aldrig inträffar.
löfte.alla
i vissa scenarier har du att göra med flera löften. Om du vill utföra en återuppringningsfunktion när alla löften har lösts, användPromise.all
statisk metod.
var pAll = Promise.all()pAll.then( ( ) => {___});
Promise.all
metoden tar en array (iterable exakt) av löften och returnerar ett nytt löfte. Det returnerade löftet pAll
löses när alla löften p1, p2, ...
har lösts framgångsrikt. Detta löfte löses med ett matrisvärde som innehåller löftets upplösningsvärden för p1, p2, ...
I den ordning de visas.
(löfte-allt.ts) som du kan se från ovanstående exempel är Promise.all
metoden Generisk och det tar typen värdet som löses av varje löfte som ges till det. Att tillhandahålla en generisk typ är ganska bra när vi använder det upplösta värdet av detta kollektiva löfte som du kan se från ovanstående resultat.
Brasilien de flesta statiska metoderna för klassenPromise
är generiska som visas i nedanstående exempel.
det finns en varning med Promise.all
. Den implementerar fail-fast-mekanismen vilket innebär att om någon av ingångslöftenap1, p2, ...
avvisas,pAll
avvisas. Om inte vänta på andra väntande löften att lösa.
(löfte-allt-avvisa.ts)
som du kan se från ovanstående resultat, eftersom 3: e löftet avvisades strax efter 1 sekund, avvisades allPromise
omedelbart.
löfte.allsettled
Promise.allSettled
statisk metod liknar Promise.all
men till skillnad från Promise.all
väntar den tills alla löften är avgjorda (vilket betyder tills de löstes eller avvisades). Därför kommer löftet som returneras av Promise.allSettled
aldrig att avvisa (men vi har lagt till catch
block i nedanstående exempel ändå).
(löfte-all-settled.ts)
arbeta med promise.allSettled
kan vara lite överväldigande som du kan från ovanstående program och dess resultat. Först och främst returnerar allSettle
metoden ett löfte som löser sig med en matris med PromiseSettledResult<type>
värden när alla löften är avgjorda. type
är härledd från typen av ingångslöftet. Typen PromiseSettledResult
ser ut som nedan.
dessa typer tillhandahålls av Typescripts standardbibliotek. Så när ett löfte löser sig, omvandlar allSettled
metoden sitt värde till PromiseFulfilledResult
form och när det misslyckas konverterar det det till PromiseRejectedResult
form. Det är därför när allSettled
är löst, det är en array av objekt där varje objekt har en form av PromiseFulfilledResult
eller PromiseRejectedResult
gränssnitt.
eftersom PromiseFulfilledResult
är en union av PromiseFulfilledResult
och PromiseRejectedResult
som har gemensam status
egenskap av bokstavlig datatyp, kan vi använda den som en diskriminant i switch/case
vakt.
bisexuell vi har pratat omswitch/case
typskydd och diskriminerande fackföreningar i typsystemlektionen.
(löfte-allt-avgjort.ts) löfte.race
Promise.race
tar en array (iterable exakt) av löften och returnerar ett nytt löfte som löser eller avvisar så snart ett av ingångslöftena löser eller avvisar. Med andra ord löses löftet som returneras av Promise.race
med resultatet av ett av ingångslöftena som löser sig snabbt.
(löfte-ras.ts) Till skillnad från Promise.all
eller Promise.allSettled
returnerar denna metod bara ett enda värde för det första avgjorda löftet, varför typen av det returnerade löftet är Promise<number>
I ovanstående fall. Sedan 1: A löftet avgjordes först bland andra, kallas then
återuppringning av fastestPromise
efter 500 ms med värdet av det lösta löftet.
bisexuell den nyaPromise.any()
metoden har nått steg 4 i ECMAScript-förslagsspåret. Promise.any
är ungefär som Promise.race
men det väntar tills det första löftet är framgångsrikt löser. Denna metod kastar ett AggregateError
undantag om alla löften avvisas.