En hurtig introduktion til” løfter “og” Async/venter”(med nye funktioner)
et løfte er en forekomst (objekt) af Promise
klasse (konstruktør). For at skabe et løfte bruger vi new Promise(executor)
syntaks og giver en eksekutorfunktion som et argument. Denne eksekutorfunktion giver et middel til at kontrollere opførslen af vores løfte opløsning eller afvisning.
i TypeScript kan vi levere datatypen for den værdi, der returneres, når løftet opfylder. Da fejlen, der returneres af løftet, kan tage en hvilken som helst form, er standarddatatypen for værdi, der returneres, når løftet afvises, indstillet til any
af TypeScript.
for at anmærke opløsningsværditypen for løftet bruger vi en generisk typedeklaration. Dybest set lover du en type med Promise
constructor i form af new Promise<Type>()
som angiver den løste værditype af løftet. Men du kan også brugelet p: Promise<Type> = new Promise()
syntaks for at opnå det samme.
Vi har diskuteret generiske klasser i detaljer i Generics-lektionen.
i ovenstående eksempel findEven
er et Løfte, der blev oprettet ved hjælp af Promise
konstruktør, der løser efter 1 sekund. Den løste datatype for dette løfte er number
, derfor giver TypeScript-kompilatoren dig ikke mulighed for at ringe resolve
funktion med en anden værdi end en værdi af typenummer number
.
standardtypen for løftets afvisningsværdi er any
og kalder derfor reject
funktion med enhver værdi er lovlig. Dette er Standardopførslen for TypeScript, og du kan finde diskussionstråden her, hvis du har dine egne meninger.
da vi har leveret number
som datatype for vellykket løfteropløsning, vil TypeScript-kompilatoren give number
typen til argumentet for value
argumentet for then
tilbagekald metode.
tilbagekaldelsen i then
– metoden udføres, når løftet er løst, og tilbagekaldelsen i catch
– metoden udføres, når den afviser eller en fejl under løsningen af løftet. Metodenfinally
registrerer et tilbagekald, der udføres, når promise enten løser eller afviser.
Hvis TypeScript compiler klager overfinally
– metoden, betyder det, at din TypeScript compiler ikke importerer typedefinitioner forfinally
– metoden. Denne metode blev introduceret i ES2016, derfor er den helt ny. Andre funktioner I Promise API, der bruges i denne lektion, er ret nye, og sørg derfor for, at din tsconfig.json
– fil har alle de nye biblioteker indlæst.
Vi har ændret det foregående eksempel og tilføjet en anden then
metode til den første then
metode. Siden den første then
metode returnerer en værdi af typen string
, vil det implicitte løfte, der returneres ved denne metode, blive løst med en værdi af typen string
. Derfor vil den anden then
metode modtage value
argument af typen string
som du kan se fra resultaterne.
løfte.løs
resolve
statisk metode tilPromise
opkald returnerer et Løfte, der allerede er løst med en værdi, som du angiver iPromise.resolve(value)
opkald. Dette er lettere end at oprette en ny forekomst af Promise-opkaldet og tilføje logik for at løse løftet med det samme.
som du kan se fra ovenstående resultater, løftet returneret af Promise.resolve(value)
opkald løser altid straks med en number
værdi siden value
argument har typen number
.
løfte.Afvis
svarende tilPromise.resolve
statisk metode,Promise.reject(error)
metode returnerer altid et afvist løfte. Værdien af løftet afvisning er taget fra error
argument og dens type er any
.
typen af løfte returneret af Promise.reject
metoden er Promise<never>
fordi dette løfte aldrig løser, så der vil ikke være nogen løfte opløsningsværdi. Derfor er typen af værdien løst ved løftet never
somnever
betyder den værdi, der aldrig opstår.
løfte.alle
i nogle scenarier har du at gøre med flere løfter. Hvis du vil udføre en tilbagekaldsfunktion, når alle løfterne er løst, skal du bruge Promise.all
statisk metode.
var pAll = Promise.all()pAll.then( ( ) => {___});
Promise.all
metoden tager et array (iterabelt præcist) af løfter og returnerer et nyt løfte. Det returnerede løfte pAll
løses, når alle løfter p1, p2, ...
løses med succes. Dette løfte løses med en array-værdi, der indeholder promise-opløsningsværdierne for p1, p2, ...
i rækkefølgen af deres udseende.
som du kan se fra ovenstående eksempel, Promise.all
metoden er generisk, og den tager typen værdien løst af hvert Løfte, der gives til den. At give en generisk type er ganske nyttigt, når vi bruger den løste værdi af dette kollektive løfte, som du kan se fra ovenstående resultat.
de fleste af de statiske metoder i
Promise
klassen er generiske som vist i nedenstående eksempler.
Der er en advarsel medPromise.all
. Det implementerer fail-fast-mekanismen, hvilket betyder, at hvis nogen af input-løfterne p1, p2, ...
afvises, pAll
afvises. Hvis vil ikke vente på andre ventende løfter til at løse.
som du kan se fra ovenstående resultat, da det 3.løfte blev afvist lige efter 1 sekund, blev allPromise
afvist straks.
løfte.allsettled
Promise.allSettled
statisk metode svarer til Promise.all
men i modsætning til Promise.all
, det venter, indtil alle løfterne er afgjort (hvilket betyder, indtil de løst eller afvist). Derfor vil løftet returneret af Promise.allSettled
aldrig afvise (men vi har tilføjet catch
blok i nedenstående eksempel alligevel).
arbejde med promise.allSettled
kan være lidt overvældende, som du kan fra ovenstående program og dets resultat. Først og fremmest allSettle
metode returnerer et Løfte, der løser med en række PromiseSettledResult<type>
værdier, når alle løfter er afgjort. type
er afledt af typen af input løfte. PromiseSettledResult
typen ser ud som nedenfor.
disse typer leveres af TypeScript ‘ s standardbibliotek. Så når et løfte løser,allSettled
metode konverterer sin værdi til PromiseFulfilledResult
form og når det fejler, konverterer det det til PromiseRejectedResult
form. Det er derfor, når allSettled
er løst, er det en række objekter, hvor hvert objekt har en form af PromiseFulfilledResult
eller PromiseRejectedResult
interface.
siden PromiseFulfilledResult
er en union af PromiseFulfilledResult
og PromiseRejectedResult
der har fælles status
egenskab af bogstavelig datatype, vi kan bruge det som en diskriminant i switch/case
vagt.
Vi har talt om
switch/case
type vagt og diskriminerende fagforeninger i typen system lektion.
løfte.race
Promise.race
tager et array (iterabelt præcist) af løfter og returnerer et nyt løfte, der løser eller afviser, så snart et af inputløfterne løser eller afviser. Med andre ord er løftet returneret af Promise.race
afgjort med resultatet af et af de input løfter, der afregner hurtigt.
i modsætning til Promise.all
eller Promise.allSettled
returnerer denne metode kun en enkelt værdi af det første afviklede løfte, hvorfor typen af det returnerede løfte er Promise<number>
i ovenstående tilfælde. Siden 1. løfte afgjort først blandt andre,then
tilbagekald affastestPromise
bliver kaldt efter 500ms med værdien af det løste løfte.
den nye
Promise.any()
metoden har nået trin 4 i ECMAScript-forslagssporet.Promise.any
er meget ligesomPromise.race
men det venter, indtil det første løfte er vellykket løser. Denne metode kaster enAggregateError
undtagelse, hvis alle løfterne afvises.