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.
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é.
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í
then
catch
finally
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 then
catch
nebo finally
metody na některou z předchozích then
catch
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.
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.
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
.
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.
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ů.
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).
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 PromiseFulfilledResult
PromiseRejectedResult
, 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.
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í.
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ě jakoPromise.race
ale čeká, až bude první slib úspěšný. Tato metoda hodíAggregateError
výjimku, pokud jsou všechny sliby odmítnuty.