Articles

rychlý úvod do „Sliby“ a „Async/Await“ (s novými funkcemi)

slib je instance (objekt) Promise třídy (constructor). Pro vytvoření slibu použijeme syntaxi new Promise(executor) a jako argument poskytneme funkci vykonavatele. Tato funkce exekutora poskytuje prostředky k řízení chování našeho řešení nebo odmítnutí slibu.

V TypeScript můžeme poskytnout datový typ vrácené hodnoty při splnění slibu. Protože chyba vrácená slibem může mít jakýkoli tvar, výchozí datový typ hodnoty vrácené při odmítnutí slibu je nastaven na any strojopisem.

Chcete-li anotovat typ hodnoty rozlišení slibu, použijeme deklaraci obecného typu. V podstatě slibujete typ sPromise Konstruktor ve tvaru new Promise<Type>(), který označuje typ vyřešené hodnoty slibu. Ale můžete také použít let p: Promise<Type> = new Promise() syntaxi, abyste dosáhli stejného.

💡 třídy generik jsme podrobně diskutovali v lekci generik.

(slib.ts)

Ve výše uvedeném příkladu, findEven je slib, který byl vytvořen pomocí Promise konstruktor, který řeší po 1 sekundu. Vyřešen typ dat tento slib je number, proto TypeScript compiler nebude umožní volat resolve funkce s jinou hodnotu, než je hodnota typu číslo, number.

výchozí typ slib, odmítnutí hodnota je any, tedy volání reject funkce s libovolnou hodnotu, je legální. Toto je výchozí chování TypeScript, a najdete diskusní vlákno zde, pokud máte své vlastní názory.

Od té doby jsme poskytli number jako datový typ úspěšné slib usnesení, TypeScript compiler bude poskytovat number typ argumentu value argument then zpětné volání metoda.

zpětného volání poskytnutých v then metoda je proveden, když slib je vyřešen a zpětné volání poskytované v catch metoda je proveden, když to odmítá nebo nějaké chybě při řešení slib. Metoda finally registruje zpětné volání, které se spustí, když promise vyřeší nebo odmítne.

Pokud kompilátor TypeScript stěžuje na metodu finally, znamená to, že kompilátor TypeScript neimportuje definice typu pro metodu finally. Tato metoda byla zavedena v ES2016, proto je zcela nová. Další funkce Promise API použité v této lekci jsou docela nové, proto se ujistěte, že váš soubor tsconfig.json obsahuje všechny nové knihovny načtené.

(tsconfig.json)

V tsconfig.json, já mám naloženo ES2020 standardní knihovna. To poskytuje podporu pro všechny funkce JavaScript až do ES2020. Pokud se chcete dozvědět více o souboru tsconfig.json nebo standardních knihovnách, přečtěte si prosím lekci kompilace (již brzy).

Slib Řetězení

thencatchfinally metody vrátit slib implicitně. Jakákoli hodnota vrácená těmito funkcemi zpětného volání je zabalena slibem a vrácena, včetně undefined. Tento implicitní slib je ve výchozím nastavení vyřešen, pokud záměrně nevracíte nový slib z těchto metod, které by mohly selhat.

Odtud můžete připojit thencatch nebo finally metody na některou z předchozích thencatch nebo finally metoda. Pokud je implicitní slib vrácen jednou z těchto metod, pak Typ vyřešené hodnoty tohoto implicitního slibu je typ vrácené hodnoty. Podívejme se na rychlý příklad.

(slib-řetězení.ts)

Jsme upravili předchozí příklad a přidal další then metoda then metoda. Od první then metoda vrací hodnotu typu string, implicitní slib, že se vrátil tímto způsobem bude vyřešen s hodnotou typu string. Proto, druhý then metoda bude přijímat value argument typu string jak můžete vidět z výsledků.

slib.řešení

resolve statické metody Promise volání vrátí slib, který je již úspěšně vyřešeny s hodnotou, které poskytují v Promise.resolve(value) volání. To je jednodušší než vytvoření nové instance výzvy Promise a přidání logiky k okamžitému vyřešení slibu.

(slib-vyřešit.ts)

Jak můžete vidět z výše uvedených výsledků, slib, že se vrátil do Promise.resolve(value) volání vždy se řeší okamžitě s number hodnoty od value argument typu number.

slib.odmítnout

podobně jako Promise.resolve statická metoda, metoda Promise.reject(error) vždy vrátí odmítnutý slib. Hodnota odmítnutí slibu je převzata z argumentu error a jeho typ je any.

(slib-odmítnout.ts)

typ slíbit, že se vrátil do Promise.reject metoda Promise<never>, protože tento slib nikdy řeší, takže tam nebude žádný slib hodnotu rozlišení. Proto typ hodnoty vyřešené slibem je never jako never znamená hodnotu, která nikdy nenastane.

slib.vše

v některých scénářích máte co do činění s více sliby. Pokud chcete provést funkci zpětného volání, když jsou všechny sliby úspěšně vyřešeny, použijte statickou metodu Promise.all.

var pAll = Promise.all()pAll.then( ( ) => {___});

Promise.all metoda bere pole (iterable přesně) sliby a vrací nový promise. Vrácený slib pAll je vyřešen, když jsou všechny sliby p1, p2, ... úspěšně vyřešeny. Tento slib je vyřešen hodnotou pole, která obsahuje hodnoty rozlišení slibu p1, p2, ... v pořadí podle jejich vzhledu.

(slib-všechno.ts)

Jak můžete vidět z výše uvedeného příkladu, Promise.all metoda je generická a to trvá zadejte hodnotu vyřešen tím, že každý slib poskytována. Poskytnutí obecného typu je velmi užitečné, když používáme vyřešenou hodnotu tohoto kolektivního slibu, jak můžete vidět z výše uvedeného výsledku.

Most většina statických metod třídy Promise je generická, jak je ukázáno v níže uvedených příkladech.

existuje jedna námitka s Promise.all. Implementuje mechanismus fail-fast, což znamená, že pokud některý ze vstupních slibů p1, p2, ... je odmítnut, pAll je odmítnut. Pokud nebude čekat na vyřešení dalších nevyřízených slibů.

(slib-all-odmítnout.ts)

Jak můžete vidět z výše uvedeného výsledku, jako 3. slib byl odmítnut jen po 1 sekundu, allPromise byla zamítnuta ihned.

slib.allSettled

Promise.allSettled statická metoda je podobná Promise.all, ale na rozdíl od Promise.all, to čeká, dokud všechny sliby se usadil (což znamená, že dokud nebudou vyřešeny, nebo zamítnuta). Proto slib, že se vrátil do Promise.allSettled nikdy odmítnout (ale přidali jsme catch blok v příkladu níže).

(slib-všechno-se usadil.ts)

Práce s promise.allSettled může být trochu ohromující, jak můžete z výše uvedeného programu a jeho výsledku. Za prvé, allSettle metoda vrací slib, který řeší s polem PromiseSettledResult<type> hodnoty, když jsou všechny sliby vyrovnány. type je odvozen od typu vstupního příslibu. Typ PromiseSettledResult vypadá níže.

tyto typy jsou poskytovány standardní knihovnou TypeScript. Takže když slib řeší, allSettled metoda převede její hodnotu do PromiseFulfilledResult tvar, a když to selže, převede jej na PromiseRejectedResult tvar. To je důvod, proč, když allSettled je vyřešen, je to pole objektů, v níž každý objekt má tvar PromiseFulfilledResult nebo PromiseRejectedResult rozhraní.

, Protože PromiseFulfilledResult unie PromiseFulfilledResultPromiseRejectedResult, který má společný status vlastnost doslovný datový typ, můžeme ji použít jako diskriminační v switch/case stráž.

talked mluvili jsme o switch/case Typ guard a diskriminační odbory v lekci Type System.

(slib-všechno-se usadil.ts)

Promise.závod

Promise.race bere pole (iterable přesně) sliby a vrací nový promise, která řeší nebo odmítne, jakmile jednou ze vstupních sliby řeší nebo odmítne. Jinými slovy, slib vrácený Promise.race je vypořádán s výsledkem jednoho ze vstupních slibů, který se rychle usadí.

(slib-závod.ts)

na Rozdíl od Promise.all nebo Promise.allSettled, tato metoda vrací pouze jednu hodnotu z první usadil slib, tedy typ vrácené slib je Promise<number> ve výše uvedeném případě. Od 1. slib usadil na prvním místě mezi ostatními, then callback fastestPromise volána po 500ms s hodnotou vyřešen slib.

new nová metoda Promise.any() dosáhla stupně 4 skladby návrhu ECMAScript. Promise.any je podobně jako Promise.race ale čeká, až bude první slib úspěšný. Tato metoda hodí AggregateError výjimku, pokud jsou všechny sliby odmítnuty.