szybkie wprowadzenie do „Promises” i „async/Await” (z nowymi funkcjami)
promise to instancja (obiekt) klasyPromise
(konstruktor). Aby utworzyć obietnicę, używamy składninew Promise(executor)
I dostarczamy funkcję executora jako argument. Ta funkcja executora zapewnia sposób kontrolowania zachowania naszego rozwiązania obietnicy lub odrzucenia.
w maszynopisie możemy podać typ danych wartości zwracanej przy spełnieniu obietnicy. Ponieważ błąd zwracany przez obietnicę może przybierać dowolny kształt, domyślny typ danych wartości zwracanej po odrzuceniu obietnicy jest ustawiany naany
przez maszynopis.
aby przypisać typ wartości rozdzielczości obietnicy, używamy ogólnej deklaracji typu. Zasadniczo obiecujesz Typ za pomocą konstruktora Promise
w postaci new Promise<Type>()
, który wskazuje rozwiązany typ wartości obietnicy. Ale możesz również użyć let p: Promise<Type> = new Promise()
składni, aby osiągnąć to samo.
💡 omówiliśmy szczegółowo zajęcia generyczne w lekcji generycznej.
w powyższym przykładziefindEven
jest obietnicą utworzoną przy użyciu konstruktoraPromise
, który rozwiązuje się po 1 sekundzie. Rozwiązanym typem danych tej obietnicy jest number
, dlatego kompilator maszynopisu nie pozwala na wywołanie funkcji resolve
z wartością inną niż wartość numeru typu number
.
domyślnym typem wartości odrzucenia obietnicy jestany
, stąd wywołanie funkcji o dowolnej wartości jest zgodne z prawem. Jest to domyślne zachowanie TypeScript, a wątek dyskusji można znaleźć tutaj, jeśli masz własne opinie.
ponieważ podaliśmy number
jako typ danych pomyślnej rozdzielczości obietnicy, kompilator TypeScript dostarczy number
typ do argumentu value
argumentu then
div > metoda callback.
wywołanie zwrotne dostarczone wthen
metoda jest wykonywana, gdy obietnica jest rozwiązana, a wywołanie zwrotne dostarczone wcatch
metoda jest wykonywana, gdy odrzuca lub jakiś błąd podczas rozwiązywania obietnicy. Metodafinally
rejestruje wywołanie zwrotne, które wykonuje się, gdy promise rozwiązuje lub odrzuca.
Jeśli kompilator TypeScript narzeka na metodęfinally
, oznacza to, że Twój kompilator TypeScript nie importuje definicji typów dla metodyfinally
. Metoda ta została wprowadzona w ES2016, stąd jest całkiem nowa. Inne funkcje interfejsu API Promise użyte w tej lekcji są całkiem nowe, dlatego upewnij się, że plik tsconfig.json
ma załadowane wszystkie nowe biblioteki.
w moim tsconfig.json
załadowałem bibliotekę standardową ES2020
. Zapewnia to wsparcie dla wszystkich funkcji JavaScript aż do ES2020. Jeśli chcesz dowiedzieć się więcej o plikachtsconfig.json
lub bibliotekach standardowych, przeczytaj lekcję kompilacji (wkrótce).
Łańcuchowanie obietnic
metodythen
catch
Ifinally
zwracają obietnicę pośrednio. Każda wartość zwracana przez te funkcje zwrotne jest owinięta obietnicą i zwrócona, w tym undefined
. Ta ukryta obietnica jest domyślnie rozwiązywana, chyba że celowo zwracasz nową obietnicę z tych metod, które mogą się nie powieść.
dlatego możesz dołączyć then
catch
lub finally
metody do dowolnego z poprzednich then
catch
lub finally
metoda. Jeśli domyślna obietnica jest zwracana przez jedną z tych metod, to typ wartości rozwiązanej tej domyślnej obietnicy jest typem zwracanej wartości. Zobaczmy szybki przykład.
zmodyfikowaliśmy poprzedni przykład i dodaliśmy kolejną metodęthen
do pierwszej metodythen
. Ponieważ pierwsza then
metoda zwraca wartość typu string
, domyślna obietnica zwracana przez tę metodę zostanie rozwiązana za pomocą wartości typu string
. Dlatego też druga metodathen
otrzymavalue
argument typustring
, jak widać z wyników.
obietnica.rozwiąż
statyczna metodaresolve
wywołaniaPromise
zwraca obietnicę, która została już rozwiązana z wartością podaną w wywołaniuPromise.resolve(value)
. Jest to łatwiejsze niż stworzenie nowej instancji wezwania obietnicy i dodanie logiki, aby natychmiast rozwiązać obietnicę.
jak widać z powyższych wyników, obietnica zwrócona przez Promise.resolve(value)
zawsze rozwiązuje się natychmiast z number
wartość od value
argument ma typ number
.
obietnica.Odrzuć
podobnie jakPromise.resolve
metoda statyczna,Promise.reject(error)
metoda zawsze zwraca odrzuconą obietnicę. Wartość odrzucenia obietnicy jest pobierana z argumentuerror
, a jego typ toany
.
typem obietnicy zwracanym przezPromise.reject
jestPromise<never>
, ponieważ ta obietnica nigdy się nie rozwiązuje, więc nie będzie żadnej wartości rozdzielczości obietnicy. Dlatego typ wartości rozwiązanej przez obietnicę to never
, ponieważ never
oznacza wartość, która nigdy nie występuje.
obietnica.wszystkie
w niektórych scenariuszach masz do czynienia z wieloma obietnicami. Jeśli chcesz wykonać funkcję zwrotną po pomyślnym rozwiązaniu wszystkich obietnic, użyj statycznej metodyPromise.all
.
var pAll = Promise.all()pAll.then( ( ) => {___});
metoda Promise.all
pobiera tablicę (dokładnie iterowalną) obietnic i zwraca nową obietnicę. Zwrócona obietnica pAll
zostanie rozwiązana, gdy wszystkie obietnice p1, p2, ...
zostaną rozwiązane pomyślnie. Ta obietnica jest rozwiązywana za pomocą wartości tablicy, która zawiera wartości rozdzielczości obietnicy p1, p2, ...
w kolejności ich pojawienia się.
jak widać z powyższego przykładu,Promise.all
metoda jest ogólna i przyjmuje typ wartości rozwiązanej przez każdą dostarczoną jej obietnicę. Podanie rodzaju ogólnego jest bardzo pomocne, gdy używamy wartości rozdzielczej tej zbiorowej obietnicy, jak widać z powyższego wyniku.
Most większość metod statycznych klasy
Promise
jest ogólna, jak pokazano w poniższych przykładach.
jest jedno zastrzeżenie zPromise.all
. Implementuje mechanizm fail-fast, co oznacza, że jeśli którakolwiek z obietnic wejściowych p1, p2, ...
zostanie odrzucona, pAll
zostanie odrzucona. Jeśli nie chcesz czekać na inne oczekujące obietnice do rozwiązania.
jak widać z powyższego wyniku, ponieważ trzecia obietnica została odrzucona tuż po 1 sekundzie,allPromise
została natychmiast odrzucona.
obietnica.wszystkie
Promise.allSettled
metoda statyczna jest podobna doPromise.all
, ale w przeciwieństwie doPromise.all
, czeka, aż wszystkie obietnice zostaną rozliczone (co oznacza, że dopóki nie zostaną rozwiązane lub odrzucone). Stąd obietnica zwrócona przezPromise.allSettled
nigdy nie zostanie odrzucona (ale dodaliśmycatch
blok w poniższym przykładzie).
praca zpromise.allSettled
może być trochę przytłaczająca, jak można z powyższego programu i jego wyniku. Po pierwsze,allSettle
metoda zwraca obietnicę, która rozwiązuje się z tablicą wartościPromiseSettledResult<type>
, gdy wszystkie obietnice są rozliczane. type
pochodzi od typu obietnicy wejściowej. TypPromiseSettledResult
wygląda jak poniżej.
typy te są dostarczane przez standardową bibliotekę TypeScript. Tak więc, gdy obietnica zostanie rozwiązana, allSettled
metoda konwertuje jej wartość na PromiseFulfilledResult
shape, a gdy nie powiedzie się, konwertuje ją na PromiseRejectedResult
shape. Dlatego, gdyallSettled
jest rozwiązany, jest to tablica obiektów, w której każdy obiekt ma kształt interfejsuPromiseFulfilledResult
lubPromiseRejectedResult
.
ponieważPromiseFulfilledResult
jest związkiemPromiseFulfilledResult
IPromiseRejectedResult
, który ma wspólnąstatus
właściwość typu danych literal, możemy użyć jej jako rozróżniacza wswitch/case
💡 rozmawialiśmy o
switch/case
Ochrona typu i dyskryminujące związki w lekcji systemu typów.
race
Promise.race
pobiera tablicę (dokładnie iterowalną) obietnic i zwraca nową obietnicę, która rozwiązuje się lub odrzuca, gdy tylko jedna z obietnic wejściowych rozwiązuje się lub odrzuca. Innymi słowy, obietnica zwrócona przez Promise.race
jest rozliczana z wynikiem jednej z obietnic wejściowych, która szybko się rozlicza.
w przeciwieństwie do Promise.all
lub Promise.allSettled
, ta metoda zwraca tylko pojedynczą wartość pierwszej rozliczonej obietnicy, stąd Typ zwracanej obietnicy to Promise<number>
w powyższym przypadku. Ponieważ pierwsza obietnica została rozliczona jako pierwsza, then
wywołanie zwrotne fastestPromise
zostanie wywołane po 500ms z wartością rozwiązanej obietnicy.
💡 nowa metoda
Promise.any()
osiągnęła etap 4 ścieżki propozycji ECMAScript.Promise.any
jest podobny doPromise.race
ale czeka, aż pierwsza obietnica się powiedzie. Ta metoda wyrzuca wyjątekAggregateError
, jeśli wszystkie obietnice zostaną odrzucone.