2016-03-29 13 views
7

Pochodzę z Angular1 i podobnie jak przyzwyczajenie do łańcuchów, chcę mieć podobne zachowanie.Jak połączyć łańcuchy widoczne dla rxjs?

Mam metodę w SomeClass: -

{......... 
     doLogin (username, password) { 
      ....... 
      ....... 
      return this.http.get(api).subscribe(
        data => {.....}, //enters here 
        err => {.....} 
     } 

Następnie Wołam tej metody: -

someclass.doLogin(username, password).subscribe(
      data => { }, //Not getting called 
      err => { } 
} 

jak wspomniałem jako komentarze w powyższym kodzie, subskrybować nie jest zostanie wywołana w klasie dzwoniących.

Wszelkie sugestie, jak to zrobić?

Odpowiedz

4

W rzeczywistości zwracasz obiekt metody subscribe. To subskrypcja, a nie obserwowalne. Więc nie będziesz mógł (ponownie) zasubskrybować zwróconego obiektu.

Observables pozwala zbudować łańcuch przepływu danych na podstawie obserwowalnych operatorów. To zależy od tego, co chcesz zrobić.

Jeśli po prostu wywołać coś lub ustawić właściwość usług z usługi, można użyć operatora do i catch jeden dla obsługi błędów:

doLogin (username, password) { 
    ....... 
    ....... 
    return this.http.get(api).do(data => { 
    ..... 
    // Call something imperatively 
    }) 
    .catch(err => { 
    ..... 
    // Eventually if you want to throw the original error 
    // return Observable.throw(err); 
    }); 
} 

Nie zapomnij podać tych operatorów, ponieważ aren „Nie uwzględnia się z pudełka przez Rxjs:

import 'rxjs/add/operator/do'; 
import 'rxjs/add/operator/catch'; 

lub globalnie (wszyscy operatorzy)

import 'rxjs/Rx'; 

zobaczyć inne pytania:

+0

To działa! Po prostu zastanawiałem się, kiedy zostanie wywołana sekcja catch-err? Ponieważ, gdy wystąpił błąd 500, oczekiwałem, że sekcja catch zostanie wywołana ... –

+0

Jeśli żądanie zostanie uznane za pomyślne zgodnie z kodem statusu (> = 200 && 300), wywołanie zwrotne sukcesu zostanie nazwane inaczej niepowodzeniem jeden (połów). Zobacz ten link: https://github.com/angular/angular/blob/master/modules/angular2/src/http/http_utils.ts#L20 –

+0

W przypadku kodu stanu 500, oddzwanianie awarii i jeden określony z operatorem catch powinien być nazywany ... –