2016-02-11 9 views
5

Piszę niewielką funkcję użytkową, które owijają wezwanie do angularjs http.get niezbędne nagłówków uwierzytelniania:HTTP RxJS i AngularJS - jak mogę to osiągnąć?

get(endpoint: string): Observable { 
    var headers = new Headers(); 
    this._appendAuthentificationHeaders(headers, this.user.credentials); 

    return this.http.get(endpoint, { headers: headers }) 
      .map(res => res.json()); 
} 

Chodzi o to, że jeśli this.user jest null, metoda będzie po prostu wypadek. Więc mam trzy opcje:

  1. zwróci null i sprawdzić, czy wartości zwracanej na każde wezwanie ...
  2. wyjątek
  3. Znajdź sposób, aby również powrócić do zaobserwowania przedmiotu RxJS które będą bezpośrednio wyzwalać obsługa błędów.

Chciałbym wprowadzić trzecią metodę, ponieważ pozwoliłoby to ujednolicić zachowanie tej metody: zawsze zwraca obserwowalne niezależnie od tego, co się stanie.

  • Czy masz pomysł, jak to zrobić?
  • Czy muszę utworzyć nowy obserwowalny i rodzaj scalenia tych dwóch?
  • Co mogę zrobić?

Odpowiedz

3

Jeśli user jest null, można po prostu wrócić surowy zaobserwować, że wyzwala błąd:

if (this.user == null) { 
    return Observable.create((observer) => { 
    observer.error('User is null'); 
    }); 
} 

(...) 

lub wykorzystanie operatora throw:

if (this.user == null) { 
    return Observable.throw('User is null'); 
} 

(...) 

ten sposób druga metoda Metoda subscribe zostanie nazwana:

observable.subscribe(
    (data) => { 
    (...) 
    }, 
    (err) => { 
    // Will be called in this case 
    } 
); 
+0

i'l iść do Observable.throw („Użytkownik nie jest null”); Wielkie dzięki! – Clement

+1

Instrukcja "Observable.throw()" okazała się być jednym z najbardziej niedostatecznie wykorzystanych i najbardziej przydatnych szablonów obsługi błędów, które napotkałem w Rx/kątowym 4. – msanford

0

Myślę, że najczystszym sposobem byłoby objęcie całego ciała funkcyjnego obserwowalnym, ponieważ zamieni on dowolny przypadkowy błąd na zauważalny błąd. Coś takiego:

get(endpoint: string): Observable { 
    return Rx.Observable.defer(() => { 
    var headers = new Headers(); 
    this._appendAuthentificationHeaders(headers, this.user.credentials); 
    return Rx.Observable.just(headers); 
    }) 
    .flatMap(headers => this.http.get(endpoint, { headers: headers })) 
    .map(res => res.json()); 
} 

Jednak ja nadal nie zgadzają się z http.get powrocie zauważalny zamiast obietnicy. Ponieważ są to pojedyncze wyceniane obserwable, czynność może być prostą funkcją asynchroniczny (sry, JS zamiast ts):

async get(endpoint) { 
    var headers = new Headers(); 
    this._appendAuthentificationHeaders(headers, this.user.credentials); 
    const res = await this.http.get(endpoint, { headers })).toPromise(); 
    return res.json(); 
} 
+0

Dzięki za odpowiedź! Moim zdaniem, Observable są nadzbiorem obietnic, więc używajmy tylko jednego spójnego API. – Clement

+0

@Clement Dużą różnicą, która sprawia, że ​​Obietnice i Observables są nieco inne, jest to, że Observables można odtwarzać. Miej to na uwadze, gdy spróbujesz zaimplementować mechanizm buforowania z obserwatorami :) Ale tak, obserwowalne są nadzbiorem obietnic. Sądzę, że będziemy musieli dostosować async-await również do obserwabli. –

+0

Co masz na myśli powtarzając? – Clement

Powiązane problemy