2017-11-29 130 views
10

Jestem nieco zdezorientowany przez operatora pipe vs tylko łańcuchy map. Czy oba poniższe przykłady są funkcjonalnie równoważne? Jaki jest cel lub korzyść funkcji rury?W Angular rxjs, kiedy powinienem użyć `pipe` kontra` map`

const name = ajax 
    .getJSON<{ name: string }>("/api/employees/alice") 
    .pipe(
    retry(3, 1000), 
    map(employee => employee.name), 
    catchError(error => of(null)) 
); 

const name = ajax 
    .getJSON<{ name: string }>("/api/employees/alice") 
    .let(retry(3, 1000)) 
    .map(employee => employee.name) 
    .catch(error => Rx.Observable.of(null)); 

Odpowiedz

18

"Nowy" sposób, używając pipe, nazywa najmu operatorówPipeable Operators. "Stary" sposób, w którym operatorzy sieciowi, nazywany jest za pomocą "operatorów łatek".

wyjścia w wersji 5.5 mamy wysyłają „podmioty pipeable”, które mogą być dostępne w rxjs/operators (zauważyć liczbę mnogą „podmioty”). Mają one być lepszym podejściem do wciągania tylko operatorów, których potrzebujesz, niż operatory "patch" znalezione w rxjs/add/operator/*.

Było kilka problems with the patch operators. Mogą również zapewnić, że Twój wyprodukowany pakiet z kodu jest mniejszy. Są też inne zalety, zobacz: documentation, która dość dobrze je pokrywa.

Aby odpowiedzieć na twoje drugie pytanie, twoje 2 próbki kodu są funkcjonalnie równoważne. Powinieneś również używać operatorów z możliwością przepuszczania przez operatorów listew, gdy tylko jest to możliwe.


Z documentation (kompletności)

problemy z poprawionych operatorów do kropka-łańcuchowych są:

  1. Każda biblioteka, która importuje operator łata będzie zwiększać się Observable.prototype dla wszystkich użytkowników tej biblioteki, tworząc ślepe zależności. Jeśli biblioteka usunie ich użycie, nieświadomie złamią wszyscy. Dzięki rurkom musisz importować operatorów, których potrzebujesz, do każdego pliku, w którym je używasz.
  2. Operatory załatane bezpośrednio na prototypie nie są "podatne na wstrząsy drzew" przy użyciu narzędzi takich jak pakiet zbiorczy lub pakiet internetowy. Potencjalni operatorzy będą takimi, jakimi są tylko funkcjami wciągniętymi bezpośrednio z modułów.
  3. Nieużywani operatorzy, którzy są importowani w aplikacjach, nie mogą być niezawodnie rozpoznawani za pomocą jakiegokolwiek narzędzia do kompilacji lub lint. Oznacza to, że możesz zaimportować scan, ale przestań z niego korzystać i nadal jest dodawany do pakunku wyjściowego. W przypadku operatorów, którzy nie używają przewodów, reguła lint może je dla ciebie odebrać.
  4. Kompozycja funkcjonalna jest niesamowita. Budowanie własnych niestandardowych operatorów staje się o wiele łatwiejsze, a teraz działają i wyglądają jak wszystkie inne operatory z rxjs. Nie trzeba już przedłużać obserwowalnego lub zastępować lift.
+0

Nazywa [operatorzy pipeable] (https://github.com/ReactiveX/rxjs/blob/master/doc/lettable-operators.md). – estus

+0

@estus - w rzeczywistości zmienili terminologię na 12 stycznia. – Igor

Powiązane problemy