Myślę, że mam podstawową koncepcję, ale są pewne niejasności
Tak więc ogólnie używam Observable
:
observable.subscribe(x => {
})
Jeśli chcę filtrować dane, mogę użyć tego:
import { first, last, map, reduce, find, skipWhile } from 'rxjs/operators';
observable.pipe(
map(x => {return x}),
first()
).subscribe(x => {
})
Mogę też to zrobić:
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/first';
observable.map(x => {return x}).first().subscribe(x => {
})
Więc moje pytania to:
- Jaka jest różnica?
- Jeśli nie ma różnicy, dlaczego ta funkcja
pipe
istnieje? - Dlaczego te funkcje wymagają różnych importów?
pipe()
pozwala mijać operatorów, których tworzysz?Odpowiedzi:
Operatory „pipable” (dawniej „lettable”) to obecny i zalecany sposób używania operatorów od wersji RxJS 5.5.
Gorąco polecam przeczytanie oficjalnej dokumentacji https://rxjs.dev/guide/v6/pipeable-operators
Główną różnicą jest to, że łatwiej jest tworzyć niestandardowe operatory i że jest to łatwiejsze do zmiany w drzewie, bez zmiany jakiegoś globalnego
Observable
obiektu, który mógłby spowodować kolizje, gdyby dwie różne strony chciały utworzyć operatora o tej samej nazwie.Użycie oddzielnych
import
instrukcji dla każdego operatora'rxjs/add/operator/first'
było sposobem na tworzenie mniejszych pakietów aplikacji. Importując tylko potrzebne operatory zamiast całej biblioteki RxJS, możesz znacznie zmniejszyć całkowity rozmiar pakietu. Jednak kompilator nie może wiedzieć, czy zaimportowałeś go,'rxjs/add/operator/first'
ponieważ naprawdę potrzebujesz go w swoim kodzie, czy po prostu zapomniałeś go usunąć podczas refaktoryzacji kodu. To jedna z zalet korzystania z operatorów rurociągów, w których niewykorzystane importy są automatycznie ignorowane.źródło
unused imports are ignored automatically
, obecnie IDE mają wtyczki, które usuwają nieużywane importy.rxjs-compat
pakiet github.com/ReactiveX/rxjs/blob/master/docs_app/content/guide/v6/ ...Metoda rurowa
Zgodnie z oryginalną dokumentacją
operator pipable polega na tym, że funkcja przyjmuje obserowalne jako dane wejściowe i zwraca inną obserwowalną.
Oryginalny post
źródło
Dobre podsumowanie, które wymyśliłem, to:
Oddziela operacje przesyłania strumieniowego (mapowanie, filtrowanie, redukowanie ...) od podstawowych funkcji (subskrypcja, potoki). Poprzez operacje na rurociągach zamiast tworzenia łańcuchów, nie zanieczyszcza prototypu Observable, ułatwiając potrząsanie drzewami.
Zobacz https://github.com/ReactiveX/rxjs/blob/master/doc/pipeable-operators.md#why
źródło
Jaka jest różnica? Jak widać w swoim przykładzie, główna różnica polega na poprawie czytelności kodu źródłowego. W twoim przykładzie są tylko dwie funkcje, ale wyobraź sobie, że jest ich kilkanaście? wtedy pójdzie jak
function1().function2().function3().function4()
robi się naprawdę brzydki i trudny do odczytania, zwłaszcza podczas wypełniania funkcji. Ponadto niektóre edytory, takie jak kod programu Visual Studio, nie zezwalają na więcej niż 140 linii. ale jeśli pójdzie jak podążanie.
To drastycznie poprawia czytelność.
Jeśli nie ma różnicy, dlaczego istnieje potok funkcyjny? Celem funkcji PIPE () jest zsumowanie wszystkich funkcji, które przyjmują i zwraca obserwowalne. Najpierw pobiera obserowalną, a następnie ta obserwowalna jest używana w całej funkcji pipe () przez każdą funkcję używaną wewnątrz niej.
Pierwsza funkcja przyjmuje obserwowalną funkcję, przetwarza ją, modyfikuje jej wartość i przechodzi do następnej funkcji, a następnie następna funkcja pobiera obserwowalne dane wyjściowe pierwszej funkcji, przetwarza je i przekazuje do następnej funkcji, a następnie kontynuuje działanie aż do wszystkich funkcji wewnątrz funkcji pipe () użyj tego obserwa- walnego, w końcu masz przetworzony obserowalny. Na koniec możesz wykonać obserwowalną funkcję subscribe (), aby wydobyć z niej wartość. Pamiętaj, że wartości w oryginalnej obserwowalnej nie ulegają zmianie. !!
Dlaczego te funkcje wymagają różnych importów? Importy zależą od tego, gdzie funkcja jest określona w pakiecie rxjs. Tak to wygląda. Wszystkie moduły są przechowywane w folderze node_modules w Angular. import {class} z "modułu";
Weźmy następujący kod jako przykład. Właśnie napisałem to w stackblitz. Nic więc nie jest generowane automatycznie ani kopiowane z innego miejsca. Nie widzę sensu kopiowania tego, co jest napisane w dokumentacji rxjs, kiedy możesz to przeczytać i przeczytać. Zakładam, że zadałeś to pytanie, ponieważ nie zrozumiałeś dokumentacji.
Funkcja Of () zwraca obserwowalny, który emituje liczby w kolejności, gdy jest subskrybowany.
Observable nie jest jeszcze subskrybowany.
Kiedy użyłeś tego, lubi Observable.pipe (), funkcja pipe () używa danego Observable jako wejścia.
Pierwsza funkcja, map () używa tego Observable, przetwarza go, zwraca przetworzony Observable z powrotem do funkcji pipe (),
wtedy ta przetworzona Observable jest przekazywana do następnej funkcji, jeśli istnieje,
i tak się dzieje, dopóki wszystkie funkcje nie przetworzą Observable,
na końcu funkcja pipe () zwraca wartość Observable do zmiennej, w poniższym przykładzie jej obs.
Rzecz w Observable polega na tym, że dopóki obserwator go nie subskrybuje, nie emituje żadnej wartości. Więc użyłem funkcji subscribe (), aby zasubskrybować to Observable, a potem jak tylko je zasubskrybowałem. Funkcja of () zaczyna emitować wartości, następnie są one przetwarzane przez funkcję pipe (), a na końcu otrzymujesz wynik końcowy, na przykład 1 jest pobierane z funkcji of (), 1 jest dodawane 1 w funkcji map (), i wrócił. Możesz pobrać tę wartość jako argument wewnątrz funkcji subscribe (funkcja ( argument ) {}).
Jeśli chcesz go wydrukować, użyj jako
https://stackblitz.com/edit/angular-ivy-plifkg
źródło