2016-12-09 2 views
1

Hier ist mein Code, der funktioniert super. Ich rufe subject.next() auf, das an einen HTTP-Anforderungsstrom sendet, der wiederum die HTTP-Antwort ausgibt. Bog Standardmuster glaube ich. Catch bietet die Fehlerbehandlung, die ich möchte.rxjs Betreff/Flatmap fertig rechts

Meine einzige Frage ... Kann es vereinfacht werden?

let subject = new Subject<string>(); 

let httpStream$ = return subject.asObservable().flatMap((emit: any) => { 

    return this.http[method](url, emit, this.options) 
    .timeout(Config.http.timeout, new Error('timeout')) 
    // emit provides access to the data emitted within the callback 
    .map((response: any) => { 
     return {emit, response}; 
    }) 
    .map(httpResponseMapCallback) 
    .catch((err: any) => { 
     return Observable.from([err.message || `${err.status} ${err.statusText}`]); 
    }); 
}).publish().refCount(); 

ich zu dem Thema abgeben kann mit ...

subject.next(dataToEmit); 

kann ich kann wie gewohnt httpStream $ abonnieren.

Wie gesagt, alles funktioniert, aber mache ich es richtig? Gibt es einen einfacheren Ansatz?

Antwort

1

Wenn Code funktioniert, gibt es nicht viel zu empfehlen. Ich nehme an, Sie benutzen Subject, weil Sie die HTTP-Anfrage manuell "erneuern" müssen.

Ich würde nur drei Dinge vorschlagen:

  • Sie brauchen nicht asObservable() zu verwenden. Das Subjekt fungiert bereits als beobachtbar. asObservable() ist nützlich, wenn Sie ein Observable (Rückgabe von einer Methode) verfügbar machen möchten, aber die Tatsache verbergen, dass Sie ein Subject intern verwenden. Da Sie den Betreff nicht zurückgeben, müssen Sie asObservable() nicht verwenden.

  • Sie müssen nie einer nach dem anderen zwei map() Operatoren verwenden:

    .map((response: any) => { 
        return httpResponseMapCallback({emit, response}); 
    }) 
    
  • Statt .publish().refCount() können Sie einfach share() verwenden, die den Alias ​​ist.

+0

danke martin, einige tolle einblicke dort sehr geschätzt – danday74