Główna » Kodowanie » Pierwsze kroki z obietnicami JavaScript

    Pierwsze kroki z obietnicami JavaScript

    Kod asynchroniczny jest przydatny do wykonywania zadań, które są czasochłonne ale oczywiście tak nie pozbawiony wad. Używa kodu asynchronicznego funkcje zwrotne aby przetworzyć jego wyniki, ale funkcje wywołania zwrotnego nie może zwrócić wartości że typowe funkcje JavaScript mogą.

    W ten sposób nie tylko odbierają nam zdolność do kontrolowania wykonanie funkcji ale także spraw obsługa błędów trochę kłopotów. To gdzie Obietnica obiekt przychodzi, ponieważ ma na celu wypełnienie niektórych dziury w kodowaniu asynchronicznym.

    Obietnica jest technicznie a standardowy obiekt wewnętrzny w JavaScript, co oznacza, że ​​przychodzi wbudowany w JavaScript. Służy do reprezentowania ostateczny wynik asynchronicznego bloku kodu (lub powód, dla którego kod się nie powiódł) i ma metody kontroli wykonanie kodu asynchronicznego.

    Składnia

    Możemy stworzyć wystąpienie Obietnica obiekt używając Nowy słowo kluczowe:

     nowa Obietnica (funkcja (rozwiązaj, odrzuć) ); 

    Funkcja przekazany jako parametr do Obietnica() konstruktor jest znany jako wykonawca. Przechowuje kod asynchroniczny i ma dwa parametry Funkcjonować rodzaj, do którego odnosi się rozwiązać i odrzucać funkcje (więcej na ten temat wkrótce).

    Stany Obietnica obiekt

    The stan początkowy a Obietnica obiekt jest wywoływany w oczekiwaniu. W tym stanie wynik obliczeń asynchronicznych nie istnieje.

    Początkowy stan oczekujący zmienia się na spełniony stan, kiedy obliczenie jest odnoszący sukcesy. The wynik obliczeń jest dostępny w tym stanie.

    W przypadku obliczeń asynchronicznych zawodzi, Obietnica obiekt przenosi się do odrzucony stan od początku w oczekiwaniu stan. W tym stanie powód niepowodzenia obliczeń (tj. komunikat o błędzie) jest dostępny.

    Aby przejść od w oczekiwaniu do spełniony stan, rozwiązać() jest nazywany. Aby przejść od w oczekiwaniu do odrzucony stan, odrzucać() jest nazywany.

    The następnie i łapać metody

    Kiedy stan zmiany od w oczekiwaniu do spełniony, obsługa zdarzeń Obietnica obiekt następnie metoda jest wykonywany. I kiedy stan zmiany od w oczekiwaniu do odrzucony, obsługa zdarzeń Obietnica obiekt łapać metoda jest wykonywany.

    Przykład 1

    “Nie promisjonowany” kod

    Załóżmy, że jest hello.txt plik zawierający “dzień dobry” słowo. Oto jak możemy napisać żądanie AJAX do pobierz ten plik i pokaż jego zawartość, bez użycia Obietnica obiekt:

     funkcja getTxt () let xhr = new XMLHttpRequest (); xhr.open („GET”, „hello.txt”); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () try switch (this.status) case 200: document.write (this.response); złamać; case 404: throw 'File Not Found'; default: throw 'Nie udało się pobrać pliku';  catch (err) console.log (err);  getTxt (); 

    Jeśli zawartość pliku była pomyślnie pobrany, to znaczy. kod statusu odpowiedzi to 200, tekst odpowiedzi to zapisane w dokumencie. Jeśli plik jest nie znaleziono (stan 404), za “Nie znaleziono pliku” pojawia się komunikat o błędzie. W przeciwnym razie a ogólny komunikat o błędzie wskazuje, że pobieranie pliku nie powiodło się.

    “Obiecany” kod

    A teraz Obiecuj powyższy kod:

     funkcja getTxt () zwraca nową Obietnicę (funkcja (rozwiązywanie, odrzucanie) let xhr = new XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () switch (this.status) case 200: resolve (this.response); case 404: reject ('File Not Found'); default: reject ('Nie udało się pobierz plik ');;);  getTxt (). then (funkcja (txt) document.write (txt);). catch (function (err) console.log (err);); 

    The getTxt () funkcja jest teraz zakodowana zwróć nową instancję Obietnica obiekt, a jego funkcja executora przechowuje kod asynchroniczny sprzed.

    Kiedy kod statusu odpowiedzi to 200, Obietnica jest spełniony przez powołanie rozwiązać() (odpowiedź jest przekazywana jako parametr rozwiązać()). Gdy kod stanu to 404 lub inny, Obietnica jest odrzucony za pomocą odrzucać() (z odpowiednim komunikatem o błędzie jako parametrem odrzucać()).

    The obsługa zdarzeń dla następnie() i łapać() metody z Obietnica obiekt jest dodane na końcu.

    Kiedy Obietnica jest spełniony, przewodnik następnie() metoda jest uruchomiona. Jego argumentem jest parametr przekazany z rozwiązać(). Wewnątrz procedury obsługi zdarzeń tekst odpowiedzi (odebrany jako argument) to zapisane w dokumencie.

    Kiedy Obietnica jest odrzucony, obsługa zdarzeń łapać() metoda jest uruchomiona, rejestrowanie błędu.

    The główna zaleta powyższej promisyfikowanej wersji kodu to obsługa błędów. Zamiast rzucać nieudane wyjątki - jak w wersji nie promisjonowanej - odpowiednie komunikaty o błędach są zwracane i rejestrowane.

    Ale to nie tylko powracający z komunikaty o błędach ale także z wynik obliczeń asynchronicznych to może być dla nas naprawdę korzystne. Aby to zobaczyć, musimy rozszerzyć nasz przykład.

    Przykład 2

    “Nie promisjonowany” kod

    Zamiast tylko wyświetlać tekst z hello.txt, chcę połącz to z “Świat” słowo i wyświetl go na ekranie po upływie 2 sekund. Oto kod, którego używam:

     funkcja getTxt () let xhr = new XMLHttpRequest (); xhr.open („GET”, „hello.txt”); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () try switch (this.status) case 200: document.write (concatTxt (this.response)); złamać; case 404: throw 'File Not Found'; default: throw 'Nie udało się pobrać pliku';  catch (err) console.log (err);  function concatTxt (res) setTimeout (function () return (res + 'World'), 2000);  getTxt (); 

    Na kodzie statusu 200, concatTxt () funkcja jest wywoływana połącz tekst odpowiedzi z “Świat” słowo przed zapisaniem go w dokumencie.

    Ale ten kod nie będzie działać zgodnie z oczekiwaniami. The setTimeout () funkcja zwrotna nie może zwrócić połączonego ciągu. To, co zostanie wydrukowane w dokumencie, to niezdefiniowany ponieważ to jest co concatTxt () zwraca.

    “Obiecany” kod

    Więc, aby kod działał, niech Obiecuj powyższy kod, włącznie z concatTxt ():

     funkcja getTxt () zwraca nową Obietnicę (funkcja (rozwiązywanie, odrzucanie) let xhr = new XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () switch (this.status) case 200: resolve (this.response); case 404: reject ('File Not Found'); default: reject ('Nie udało się pobierz plik ');;);  function concatTxt (txt) return new Promise (function (resolve, reject) setTimeout (function () resolve (txt + 'World');, 2000););  getTxt (). then ((txt) => return concatTxt (txt);). następnie ((txt) => document.write (txt);). catch ((err) => console. log (err);); 

    Tak jak getTxt (), concatTxt () funkcja również zwraca nowy Obietnica obiekt zamiast połączonego tekstu. The Obietnica wrócił przez concatTxt () jest rozwiązany wewnątrz funkcji wywołania zwrotnego setTimeout ().

    Pod koniec powyższego kodu, obsługa zdarzeń pierwszego następnie() metoda działa, gdy Obietnica z getTxt () jest spełniony, tj. kiedy plik jest został pomyślnie pobrany. Wewnątrz tego przewodnika, concatTxt () jest nazywany i Obietnica wrócił przez concatTxt () jest zwracany.

    Obsługa zdarzeń drugiej następnie() metoda działa, gdy Obietnica wrócił przez concatTxt () jest spełniony, tj upłynęło dwie sekundy i rozwiązać() jest nazywany z połączonym ciągiem jako jego parametrem.

    Wreszcie, łapać() łapie wszystkie wyjątki i komunikaty o błędach z obu obietnic.

    W tej wersji Promisified, “Witaj świecie” ciąg będzie pomyślnie wydrukowane do dokumentu.