Articles

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.

(løfte.ts)

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.

(tsconfig.json)

i min tsconfig.json, jeg har indlæst ES2020 standardbibliotek. Dette giver support til Al JavaScript-funktion indtil ES2020. Hvis du vil vide mere om tsconfig.json fil eller standardbiblioteker, skal du læse Kompileringslektionen (kommer snart).

Promise Chaining

thencatch og finally metoder returnerer et løfte implicit. Enhver værdi, der returneres af disse tilbagekaldsfunktioner, er pakket med et løfte og returneret, inklusive undefined. Dette implicitte løfte løses som standard, medmindre du bevidst returnerer et nyt løfte fra disse metoder, der kan mislykkes.

derfor kan du tilføje thencatch eller finally metoder til nogen af de foregående thencatch eller finally metode. Hvis et implicit løfte returneres ved hjælp af en af disse metoder, er den løste værditype for dette implicitte løfte typen af den returnerede værdi. Lad os se et hurtigt eksempel.

(promise-chaining.ts)

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.

(promise-resolve.ts)

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.

(løfte-afvise.ts)

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

(løfte-alle.ts)

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

(løfte-alle-afvise.ts)

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.allSettledaldrig afvise (men vi har tilføjet catch blok i nedenstående eksempel alligevel).

(løfte-alt-afgjort.ts)

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 allSettleder løst, er det en række objekter, hvor hvert objekt har en form af PromiseFulfilledResulteller 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-alt-afgjort.ts)

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.

(løfte-race.ts)

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 nyePromise.any() metoden har nået trin 4 i ECMAScript-forslagssporet. Promise.anyer meget ligesom Promise.race men det venter, indtil det første løfte er vellykket løser. Denne metode kaster enAggregateError undtagelse, hvis alle løfterne afvises.