JavaScript obiecuje samouczek z przykładami
- 4127
- 626
- Igor Madej
Choć wcześniej dostępne za pośrednictwem bibliotek stron, obietnice zostały wprowadzone w JavaScript, jako rodzimy
funkcja z ecmascript6.
Stanowią alternatywę dla zwrotów zwrotnych w kontaktach z kodem asynchronicznym, zapewniając,
Wśród innych rzeczy, czystszy sposób radzenia sobie z błędami. W tym samouczku zobaczymy, jak działają obietnice, jak to zrobić
Utwórz je i jak używać ich metod.
W tym samouczku nauczysz się:
- Czym jest obietnica JavaScript.
- Jak stworzyć obietnicę JavaScript.
- Jak można użyć obietnic do zarządzania kodem asynchronicznym.
- Jakie są metody, które można użyć z obietnicą.
Zastosowane wymagania i konwencje oprogramowania
Kategoria | Wymagania, konwencje lub wersja oprogramowania |
---|---|
System | System operacyjny agnostyk. |
Oprogramowanie | Instalacja węzeł Aby śledzić ten samouczek w środowisku niebędącym przeglądarką. |
Inny | Znajomość koncepcji JavaScript i obiektowych. |
Konwencje | # - Wymaga, aby podane polecenia Linux są wykonywane z uprawnieniami root bezpośrednio jako użytkownik root lub za pomocą sudo Komenda$ - Wymaga, aby podane polecenia Linux zostały wykonane jako zwykły użytkownik niepewny |
Czym jest „obietnica”?
W JavaScript, a obietnica
jest obiektem zwróconym w wyniku
asynchroniczna, nie blokująca operacja, na przykład ta wykonana przez aportować
Funkcja wbudowana. Obietnice zostały wprowadzone jako funkcja natywna z EcMascript6
: reprezentują
czystsza alternatywa dla wywoławczych, dzięki funkcjom takim jak łączenie metod i fakt, że zapewniają one
sposób zarządzania błędami, które przypominają obsługę wyjątków w kodzie synchronicznym. Są trzy stany obiecane
może być w:
- Aż do
- Rozwiązany
- Odrzucony
Jak sama nazwa wskazuje, mówimy, że jest obietnica aż do
Kiedy jego wynik nie został jeszcze rozstrzygnięty,
więc nadal można go rozwiązać lub odrzucić. Mówimy, że jest obietnica spełniony
Kiedy asynchroniczny
Operacja zakończyła się powodzeniem: obietnica została rozwiązana i zawiera wynik samej operacji.
Wreszcie, mówi się, że jest obietnica odrzucony
Gdy operacja asynchroniczna się nie powiedzie: w takim przypadku
Obietnica będzie zawierać przyczynę awarii.
Tworzenie obietnicy JavaScript
Jak wspomniano powyżej, niektóre funkcje, które wykonują operacje asynchroniczne, takie jak aportować
, powrót
Domyślnie obietnica, abyśmy mogli użyć metod i wzorów, które opiszemy później w tym samouczku poza pudełkiem. Inne funkcje
Nie wspiera jeszcze obietnic, więc możemy chcieć stworzyć obietnicę wokół nich. Konstruktor obietnicy bierze jeden argument,
która jest funkcją odwołania, która sama przyjmuje dwa argumenty: rozstrzygać
I odrzucić
oddzwonienia, które
są wezwani do rozwiązania lub odrzucenia obietnicy odpowiednio. Zobaczmy szybki przykład, jak stworzyć trywialną obietnicę:
const obiecing = new obiecing (funkcja (rozdzielcz, odrzuć) settimeout (rozdzielcz, 100, „sukces!'); );
Z powyższym kodem stworzyliśmy obietnicę, która w rzeczywistości będzie zawsze rozwiązywana, ponieważ przy użyciuSettimeout
funkcja, nazywamy rozstrzygać
oddzwonienie po limicie 100 milisekund,
Przekazanie ciągu „Sukces!„Jako jedyny argument zwrotu oddzwonienia. W ten sam sposób, jeśli chcieliśmy obietnicy
do odrzucenia, powinniśmy przywołać odrzucić
oddzwonić. Oczywiście obietnica taka jak
Jeden powyżej nie jest dla nas bardzo przydatny, więc teraz spróbujemy stworzyć obietnicę wokół faktycznie użytecznej funkcji.
odczyt
Metoda fs
moduł, asynchronicznie odczytuje zawartość pliku i
przyjmuje trzy argumenty: dwa z nich są obowiązkowe, a jeden jest opcjonalny. Pierwszym argumentem jest ścieżka pliku
do przeczytania. Drugi argument jest opcjonalny, a wraz z nim możemy na przykład określićkodowanie
być stosowane. Trzecim argumentem jest funkcja wywołania zwrotnego, która sama przyjmuje dwa argumenty:błądzić
I dane
.
Jeśli operacja odczytu się nie powiedzie, pierwszy argument będzie zawierał Błąd
Obiekt i drugi zostaną niezdefiniowane; Jeśli operacja zakończy się powodzeniem, drugim argumentem będzie
ciąg reprezentujący zawartość pliku lub surowy bufor, jeśli nie zostanie określone kodowanie, a pierwszy argument będzie
Być zero
. Powiedz na przykład, chcę przeczytać moje .VIMRC
Plik za pomocą tej funkcji:
const fs = wymaga („fs”); fs.czytaj plik ('.vimrc ',' utf-8 ', funkcja (err, data) if (err) throw err konsola.log (data));
Przede wszystkim potrzebowaliśmy fs
moduł i przypisał go do fs
stały, niż
Poszliśmy wywołując odczyt
metoda. W przypadku wywołania zwrotnym zaakceptowanym jako ostatni argument funkcji wykonujemy
potrzebne operacje w zależności od uzyskanego wyniku. W powyższym kodzie rzucić
wyjątek, jeśli wystąpi jakiś błąd
Podczas próby odczytania pliku, a my po prostu drukujemy zawartość pliku, jeśli wszystko pójdzie zgodnie z oczekiwaniami. W takim przypadku byłoby to
Wynik (obcięty):
[…] Ustaw FileFormat = UNIX SET TEXTWIDTH = 79 Ustaw NoswapFile Set FoldMethod = wskaźnik set foldlevel = 99 Ustaw set splitbelow set hlsearch set incsearch set SET SET SETCASE […]
Metoda, której właśnie użyliśmy, odczyt
, wykonuje asynchronicznie operację odczytu, więc nie blokuje. Domyślnie to nie,
Jednak wspieranie obietnic. Jeśli chcemy „obiecać” zastosowanie tej metody, sami powinniśmy stworzyć obietnicę wokół niej:
const fs = wymaga („fs”); funkcja readFilePromise (filePath) return new obiec.readFile (FilePath, 'utf-8', funkcja (err, data) if (err) reject (err); else rozdzielcz (data);); );
Spójrz na powyższy kod, co zmieniliśmy? Stworzyliśmy ReadFilePromise
Funkcja: wewnątrz
obietnica oparta na wyniku fs.odczyt
Metoda jest tworzona i zwracana. W poprzednim przykładzie,
Dostosowaliśmy kod, aby rzucić wyjątek, jeśli błąd w operacji odczytu był obecny: w tym przypadku, ponieważ my
buduje obietnicę, jeśli wystąpi błąd, wywołujemy odrzucić
oddzwonienie, przekazywanie błędu jako jedynego argumentu,
W ten sposób odrzucając obietnicę. Jeśli operacja odczytu jest przeprowadzana pomyślnie, zamiast tego dzwonimy rozstrzygać
, przechodzący
dane wynikające z operacji odczytu jako argumentu, spełniając w ten sposób obietnicę. W następnym akapicie zobaczymy, jak
Aby faktycznie pochłonąć obietnicę, którą właśnie stworzyliśmy.
Metody obietnicy
Obiekt obietnicy nie przydałby się, gdybyśmy nie mieli sposobów na interakcję z nim i konsumpcję. W tej sekcji będziemy
Opisz metody, które możemy użyć w obiekcie obietnicy. Każda z tych metod działa na obietnicę, a z kolei zwraca obietnicę
sam, pozwalając nam stworzyć „stos” i wykonać metodę łańcuch
.
Następnie metoda
Następnie
Metoda przyjmuje dwa argumenty, które w rzeczywistości są dwoma zwrotami, które należy wykonać odpowiednio, gdy obietnica
jest spełniony, a kiedy zostanie odrzucony i zwraca obietnicę. Trzymając się powyższego przykładu, oto jak moglibyśmy użyć tej metody
Aby wchodzić w interakcje z obietnicą, zwróconą, gdy zadzwonimy ReadFilePromise
funkcjonować:
ReadFilePromise ('.vimrc ').Następnie (funkcja onResolVeCallback (data) konsola.log (dane); , funkcja onrejectCallback (powód) konsola.log („komunikat o błędzie to $ powód”); )
Kiedy obietnica wychodzi z aż do
stan, a zatem jest to rozwiązane lub odrzucone, Następnie
metoda
wykonany. Jeśli obietnica zostanie rozwiązana, pierwsze oddzwonienie (w tym przypadku nazwaliśmy oddzwonienie, aby ułatwić zrozumienie ich ról)
jest wykonywany, a jego argument zawierał wynik operacji asynchronicznej (w tym przypadku treść „.plik vimrc ”jako ciąg).
Jeśli obietnica zostanie odrzucona, zamiast tego zostanie wykonany drugi zwrot (nazwaliśmy go onrejectCallback): jego argument będzie zawierał błąd
co spowodowało awarię operacji odczytu.
złapać metoda
w odróżnieniu Następnie
, który obsługuje zarówno, gdy obietnica jest rozwiązana i odrzucona, złapać
Metoda jest bardziej szczegółowa,
i zajmuje się tym drugim przypadkiem. Stosowanie tej metody jest odpowiednikiem stosowania Następnie
z nieokreślony
jak
Pierwszy argument, zamiast oddzwonienia używanego do obsługi sprawy, gdy obietnica jest spełniona, oraz z prawidłowym zwrotem oddzwonienia do obsługi
przypadek, gdy obietnica jest odrzucona, jako druga. Ta metoda zwraca obietnicę, a używając jej, możemy przepisać powyższy kod w ten sposób:
ReadFilePromise ('.vimrc ') // Wewnątrz „Następnie„ Zarządzamy sprawą, gdy obietnica jest spełniona, zajmując się // z możliwymi błędami wewnątrz „Catch” .następnie (funkcja (data) konsola.log (dane); ) .catch (funkcja (powód) konsola.log („komunikat o błędzie to $ powód”); )
Obserwuj, jak dołączyliśmy złapać
metoda po Następnie
: to jest możliwe
Ponieważ, jak powiedzieliśmy powyżej, każda metoda sama zwraca obietnicę, więc można je przykuć.
Wreszcie metoda
Jako metody, które widzieliśmy powyżej, Wreszcie
zwraca obietnicę. Jest zawsze wykonywany bez względu na stan obietnicy,
zarówno, jeśli zostanie rozwiązany lub odrzucony. Z tego powodu wywołanie zwrotne nie wymaga żadnych argumentów, ponieważ kiedy działa, nie ma sposobu na ustalenie
Jeśli obietnica została odrzucona lub rozwiązana. Używamy tej metody, gdy chcemy uruchomić kod ogólny, który powinien być uruchomiony w każdym przypadku.
ReadFilePromise ('.vimrc ') .następnie (funkcja (data) konsola.log (dane); ) .catch (funkcja (powód) konsola.log („komunikat o błędzie to $ powód”); ) .Wreszcie (funkcja () konsola.Log („Zawsze jestem wykonywany!");)
W powyższym przykładzie, niezależnie od tego, czy obietnica jest rozwiązana, czy odrzucona, ciąg „Zawsze jestem wykonywany!„Jest wydrukowany na konsoli.
wyścig metoda
Ta metoda przyjmuje iterabinę (na przykład tablicę) jako jej argument. Zwraca obietnicę, która zostanie rozwiązana lub odrzucona, gdy tylko
Obietnica zawarta w iteracyjnym, istnieje stan oczekujący i zostaje odrzucony lub rozwiązany. Zwrócona obietnica będzie miała
wartość spełnienia lub powód odrzucenia wspomnianej obietnicy.
const p1 = new o obietnicy (funkcja (rozdzielcz, odrzuć) settimeout (rozdzielcz, 100, „rozstrzygnięta!'); ); const p2 = new o obietnicy (funkcja (desolve, odrzuć) settimeout (odrzucenie, 50, „odrzucono!'); ); Obietnica.Rasa ([P1, P2]) .następnie (funkcja (data) konsola.log (dane); ) .catch (funkcja (powód) konsola.log (powód); )
W tym przykładzie stworzyliśmy dwie nowe obietnice: pierwsza, P1
, zostanie rozwiązany po 100 milisekundach;
Druga, P2
, zostanie odrzucony po 50 milisekundach. Minęliśmy iterację zawierającą obie obietnice jako
jedyny argument Obietnica.wyścig
metoda. Jeśli uruchomimy powyższy kod, otrzymamy następujący wynik:
odrzucony!
Co się stało? Zgodnie z oczekiwaniami P2
Obietnica jest pierwszą osiedleniem się (jest odrzucona), w konsekwencji obietnica
zwrócone przez Obietnica.wyścig
Metoda, odrzuca z tego samego powodu. Jak widać, stan obietnicy nie jest istotny:
pierwszy, który faktycznie otrzymuje status inny niż aż do
to ten, który ma znaczenie.
Wszystko metoda
Tak jak wyścig
, Wszystko
Metoda przyjmuje iterabinę jako jedyny argument. Zwraca obietnicę, która
rozwiązać, gdy wszystkie obietnice zawarte w iterable rozwiązują (lub gdy iterable nie zawiera obietnic) lub będzie
odrzucić z powodu pierwszej obietnicy w iterabinie, która odrzuci. Na przykład:
const p1 = new o obietnicy (funkcja (rozdzielcz, odrzuć) settimeout (rozdzielcz, 100, 'p1 rozwiązany!'); ) const p2 = new o obietnicy (funkcja (rozdzielcz, odrzuć) settimeout (rozdzielcz, 100, 'p2 rozwiązany!'); ) Obietnica.Wszystkie ([p1, p2]) .następnie (funkcja (wartości) konsola.log (wartości); )
Powyższy kod powróci:
['P1 rozwiązane!', „P2 rozwiązany!']
Wszystkie obietnice zawarte w iteracyjnym rozwiązaniu, więc oczekująca obietnica zwrócona przez Wszystko
metoda
rozwiązane, a jego wartość jest tablicą zawierającą wartości wszystkich rozwiązanych obietnic. Jeśli jeden (i jak najszybciej) jedna z obietnic
W odrzucach iterowalnych obietnica zwrócona przez metodę odrzuca również z tego samego powodu. Jeśli iterable przekazane jako argument
był pusty, już zwrócona byłaby już obietnica. Gdyby nie zawierał obietnic, metoda powróciłaby
asynchronicznie rozwiązywana obietnica lub już rozwiązana w zależności od środowiska.
rozstrzygać I odrzucić metody
Te dwie metody są objaśniające.
rozstrzygać
Metoda przyjmuje argument, który jest wartością, którą należy rozwiązać według obietnicy.
Zwraca obietnicę, która jest rozstrzygnięta z tą wartością. odrzucić
Metoda podobnie przyjmuje argument, który jest przyczyną
Obietnica powinna zostać odrzucona i zwraca obietnicę odrzuconą z danym powodem. Na przykład:
// Rozwiązuj obietnicę obietnicy.Resolve („Wartość rozdzielona”); // Odrzuć obietnicę obietnicy.Odrzuć („powód do odrzucenia”);
Wnioski
W tym samouczku nauczyliśmy się znać i używać obietnic w JavaScript. Widzieliśmy, jak możemy zbudować własne obietnice, jakie są związane metody
z obietnicą i jak możemy go użyć do zarządzania kodem asynchronicznym, jako czystsza alternatywa dla oddzwonienia. Ważne źródło do dalszego zwiększenia
Twoja wiedza na temat obietnic, że jest to ta dostarczona przez Mozillę.
W następnym samouczku JavaScript dowiemy się, jak korzystać Funkcje strzałek
. Bądź na bieżąco z Linuxconfig.org!
Powiązane samouczki Linux:
- Jak zbudować aplikację Tkinter za pomocą obiektu zorientowanego na…
- Samouczek debugowania GDB dla początkujących
- Jak pracować z WooCommerce Rest API z Pythonem
- Wyrażenia regularne Pythona z przykładami
- Advanced Bash Regex z przykładami
- Mastering Bash Script Loops
- Zagnieżdżone pętle w skryptach Bash
- Jak skonfigurować serwer OpenVPN na Ubuntu 20.04
- Zainstaluj Arch Linux na stacji roboczej VMware
- Pętle bash z przykładami