Articles

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.

(promise.ts)

w powyższym przykładziefindEvenjest 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.

(tsconfig.JSON)

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

metodythencatch 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ć thencatch lub finally metody do dowolnego z poprzednich thencatch 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.

(promise-chaining.ts)

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

(promise-resolve.ts)

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.

(promise-reject.ts)

typem obietnicy zwracanym przezPromise.rejectjestPromise<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ę.

(promise-all.ts)

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

(promise-all-reject.ts)

jak widać z powyższego wyniku, ponieważ trzecia obietnica została odrzucona tuż po 1 sekundzie,allPromise została natychmiast odrzucona.

obietnica.wszystkie

Promise.allSettledmetoda 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).

(promise-all-setted.ts)

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 oswitch/case Ochrona typu i dyskryminujące związki w lekcji systemu typów.

(promise-all-settled.ts)

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.

(promise-race.ts)

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.anyjest podobny doPromise.race ale czeka, aż pierwsza obietnica się powiedzie. Ta metoda wyrzuca wyjątekAggregateError, jeśli wszystkie obietnice zostaną odrzucone.