Obserwacje i operacje tablicowe

Oprócz prostej iteracji nad kolekcją asynchroniczną, możemy wykonywać inne operacje, takie jak filtrowanie, mapowanie i wiele innych, zgodnie z definicją w API RxJS. To jest to, co łączy Observable z wzorcem iteracyjnym, i pozwala nam traktować dane jako kolekcje (iterowalne).

Rozwińmy nasz przykład [043] i zrób coś więcej za pomocą naszego strumienia:

export class MyApp {
  private doctors = [];

  constructor(http: Http) {
    http.get('http://jsonplaceholder.typicode.com/users/')
        .flatMap((response) => response.json())
        .filter((person) => person.id > 5)
        .map((person) => "Dr " + person.name)
        .subscribe((data) => {
          this.doctors.push(data);
        });
  }
}

Zobacz przykład [045]

Oto dwie naprawdę użyteczne operacje tablicowe - map ifilter. Co dokładnie one robią?

  • map utworzy nową tablicę z wynikami wywołania funkcji podanej na każdym elemencie w tej tablicy. W tym przykładzie użyliśmy go do stworzenia nowego zestawu wyników poprzez iterowanie przez każdy element i dołączanie Dr skrót przed nazwą każdego użytkownika. Teraz każdy obiekt w naszej tablicy ma Dr poprzedzone wartością właściwości name.

  • filter utworzy nową tablicę ze wszystkimi elementami, które przejdą test zaimplementowany przez udostępnioną funkcję. Tutaj użyliśmy go do utworzenia nowego zestawu wyników poprzez wykluczenie dowolnego użytkownika, którego właściwość id jest mniejsza niż sześć.

Teraz w wywołaniu subscribe dostajemy listą obiektów JSON, których właściwościid są większe niż lub równe sześciu i których właściwości name zostały uzupełnione ozDr.

Funkcje map i filter pochodzące z Observable zwracają Observable - dlatego można łączyć je w łańcuch kropkami. Aby uzyskać pierwszy element tego łańcucha (obiekt klasy Observable) - podobnie jak w poprzednim przykładzie używamy flatMap. Konwertuje ona tablicę obiektów JSON na strumień Observable..

Istnieje wiele innych operacji tablicowych, które można zastosować wraz z Observables; szukaj ich w RxJS API, na http://reactivex.io/ oraz rxmarbles.com.