Articles

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.

/ div>

(løfte.ts)

i eksemplet ovenfor erfindEvenet 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 resolvefunksjon 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.

(tsconfig.json)

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

thencatchog 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 thencatch eller finally metoder til noen av de forrige thencatch 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.

ts)

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.

(løfte-løse.ts)

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.

(løfte-avvis.ts)

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.

(løfte-alt.ts)

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 iPromise 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.

ts)

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).

ts)

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.

/ div>

(løfte-alt-avgjort.ts)

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.

(løfte-løp.

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 som Promise.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.