2016-02-11 16 views
5

Sto scrivendo una piccola funzione di utilità che avvolgono una chiamata a AngularJS http.get con le intestazioni di autenticazione necessarie:RxJS e AngularJS HTTP: come posso ottenere questo risultato?

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()); 
} 

Il punto qui è che se this.user è nullo, il metodo sarà solo crash. Così ho tre opzioni:

  1. ritorno nulli e verificare che il valore di ritorno su ogni chiamata ...
  2. un'eccezione
  3. Trovare un modo per restituire anche un oggetto Observable RxJS che attiverà direttamente la gestore degli errori.

Vorrei implementare il terzo metodo, in quanto mi consente di unificare il comportamento di questo metodo: restituisce sempre un osservabile indipendentemente da ciò che accade.

  • Avete un'idea su come farlo?
  • Devo creare un nuovo Osservabile e unire questi due?
  • Cosa posso fare?

risposta

3

Se il user è null, si può semplicemente restituire un osservabile grezza che genera un errore:

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

(...) 

o sfruttare la throw dell'operatore:

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

(...) 

In questo modo il secondo metodo di il metodo subscribe verrà chiamato:

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

I'l andare per Observable.throw ('utente è nullo'); Grazie mille! – Clement

+1

Un manuale 'Observable.throw()' ha dimostrato di essere uno dei pattern di gestione degli errori più sottoutilizzati e più utili che ho incontrato in Rx/angular 4. – msanford

0

Penso che il modo più pulito sarebbe quello di avvolgere l'intero corpo della funzione in un osservabile, in quanto trasformerà qualsiasi errore accidentale in un errore osservabile. Qualcosa di simile a questo:

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()); 
} 

Tuttavia ancora non sono d'accordo con http.get restituzione di un osservabile, invece di una promessa. Poiché si tratta di singoli osservabili stimati, la funzione potrebbe essere una funzione asincrona semplice (SRY, JS invece di 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

Grazie per la risposta! Secondo me, Observable è un superset di promesse, quindi usiamo solo una api coerente. – Clement

+0

@Clement La grande differenza che rende Promises and Observables un po 'diversa è che gli Observable sono rigiocabili. Tienilo a mente quando cerchi di implementare un meccanismo di memorizzazione nella cache con osservabili :) Ma sì, gli osservabili sono il superset delle promesse. Suppongo che dovremo adattare anche async-await agli osservabili. –

+0

Cosa intendi per rigiocabilità? – Clement