Wymagania: Projekt musi przekonwertować Observables na Promises i poczekać na zakończenie, a przy użyciu metody toPromise() w projekcie Angular wskazówka została wycofana, a następnie zaleca się użycie statycznych metod firstValueFrom lub lastValueFrom.
Dlaczego wykluczyć metodę toPromise()?
Ponieważ nazwa metody toPromise() nigdy nie wskazuje, którą wartość emitowaną Promise zostanie rozwiązana, ponieważ Observables mogą generować wiele wartości w czasie. Podczas konwersji na Obietnicę możesz chcieć wybrać, czy chcesz wybrać pierwszą wartość, która się pojawi, czy ostatnią. Aby rozwiązać wszystkie te problemy, zdecydowaliśmy się wycofać toPromise() i wprowadzić dwie nowe funkcje pomocnicze do konwersji na promise.
Po prostu zrozumObserwable generują wiele wartościA potemObietnice przyniosą tylko jedną wartośćNastępnie niektórzy użytkownicy chcą użyć pierwszej wartości, a inni ostatniej, więc pojawiają się firstValueFrom i lastValueFrom. (Uwaga: toPromise() to ostatnia wartość, która otrzymuje obserwable)
firstValueFrom przykład
Możesz chcieć uzyskać pierwszą wartość, gdy dotrze, bez czekania na ukończenie Observable, więc możesz użyć firstValueFrom. firstValueFrom rozwiąże Obietkę z pierwszą wartością emitowaną przez Obserwable i natychmiast się zrezygnuje, aby zachować zasób. Jeśli Observable zakończy się bez wygenerowania żadnej wartości, firstValueFrom również zostanie odrzucony z błędem EmptyError.
lastValueFrom przykład
lastValueFrom jest niemal identyczny z toPromise(), co oznacza, że będzie analizował ostatnią wartość osiągniętą po ukończeniu Observable, ale zachowuje się inaczej, gdy Observable jest kompletny bez wydawania pojedynczej wartości. Gdy Observable zakończy się bez wywołania, toPromise() pomyślnie rozwiąże się jako niezdefiniowany (czyli typ returnu się zmieni), a lastValueFrom zostanie odrzucony jako EmptyError. Dlatego typ return lastValueFrom to Promise<T>, podobnie jak toPromise() w RxJS 6.
Przykładowe parsowanie
W RxJS interval(1000) generuje obserwable, która co 1000 milisekund (czyli 1 sekundę) emituje stopniowy ciąg liczb, zaczynając od 0.
Następnie .pipe(take(10)) to łańcuch operatorów ograniczający liczbę elementów emitowanych przez Observable. Tutaj take(10) oznacza, że przyjmowane są tylko wartości pierwszych 10 wyemitowanych danych.
Wyjaśnijmy to wyrażenie szczegółowo:
interval(1000): Stwórz obserwable, która co sekundę emituje liczbę. Ciąg liczb zaczyna się od 0 i za każdym razem rośnie o 1.
.pipe(take(10)): Użyj metody .pipe() do połączenia wielu operatorów. Tutaj używamy operatora take(10), który ogranicza Obserwable do emisji tylko pierwszych 10 wartości.
Test błędów EmptyError
Kod jest następujący:
lub
Odniesienie:Logowanie do linku jest widoczne. |