Articles

En snabb introduktion till” löften ”och” Async/Await”(med nya funktioner)

ett löfte är en instans (objekt) av Promise klass (konstruktör). För att skapa ett löfte använder vi new Promise(executor) syntax och ger en exekutörsfunktion som ett argument. Denna exekutör funktion ger ett sätt att kontrollera beteendet hos vårt löfte upplösning eller avslag.

i TypeScript kan vi tillhandahålla datatypen för det värde som returneras när promise uppfyller. Eftersom felet som returneras av löftet kan ta vilken form som helst, ställs standarddatatypen för värde som returneras när löftet avvisas till any av TypeScript.

för att kommentera löftets upplösningsvärde använder vi en generisk typdeklaration. I grund och botten lovar du en typ med Promise konstruktör i form av new Promise<Type>() som indikerar löftets upplösta värdetyp. Men du kan också använda let p: Promise<Type> = new Promise() syntax för att uppnå detsamma.

exporter vi har diskuterat generikklasser i detalj i generiklektionen.

(löfte.ts)

i exemplet ovan är findEven ett löfte som skapades med Promise konstruktör som löser efter 1 sekund. Den lösta datatypen för detta löfte är number, varför TypeScript-kompilatorn inte tillåter dig att ringa resolve – funktionen med ett annat värde än ett värde av typnummer number.

standardtypen för löftets avvisningsvärde är any, därför kallar reject funktion med något värde är lagligt. Detta är standardbeteendet för TypeScript, och du kan hitta diskussionstråden här om du har dina egna åsikter.

eftersom vi har tillhandahållit number som datatyp för framgångsrik löftupplösning, kommer TypeScript-kompilatorn att ge number typ till argumentet för value argumentet för then återuppringning metod.

återuppringningen som tillhandahålls i then – metoden körs när löftet är löst och återuppringningen som tillhandahålls icatch – metoden körs när den avvisar eller något fel när löftet löses. Metoden finally registrerar en återuppringning som körs när löfte antingen löser eller avvisar.

om TypeScript-kompilatorn klagar över metoden finally, betyder det att din TypeScript-kompilator inte importerar typdefinitioner för metoden finally. Denna metod introducerades i ES2016, därför är den ganska ny. Andra funktioner I Promise API som används i den här lektionen är ganska nya, så se till att din tsconfig.json – fil har alla nya bibliotek laddade.

(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

thencatch 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 thencatch eller finally metoder till någon av de tidigare thencatch 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.allSettledaldrig 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.