2017-02-02 5 views
0

Ich schrieb eine generische Anforderungsmethode, die einen Ladeindikator anzeigen soll, während die Anfrage ausgeführt wird. Wenn ein Fehler auftritt (wie 404), zeige ich die Nachricht in .catch und dann return Observable.empty(), so dass der folgende Code nicht abstürzt (da keine Daten zurückgegeben werden). Das große Problem ist, dass dann auch .finally nicht aufgerufen wird. Ist das ein Fehler? Gibt es eine Problemumgehung? Hier ist mein Code:finally() wird nicht aufgerufen, wenn leer() in catch() zurückgegeben wird

res = Observable 
    .of(true) 
    .do(() => this.store.dispatch(new ShowLoadingIndicatorAction())) 
    .switchMap(() => this.http.get(url, { headers: this.headers })) 
    .publishReplay(1) 
    .refCount() 
    .catch(error => { 
    this.messages.handleRequestError(error); 
    return Observable.empty(); 
    }) 
    .finally(() => this.store.dispatch(new HideLoadingIndicatorAction())); 

// then later: 
res.subscribe(doStuffWithData); 

Antwort

2

Welche RxJS-Version verwenden Sie? Es tut funktioniert gut in diesem Beispiel:

const res$ = Rx.Observable 
 
    .of(true) 
 
    .switchMap(() => Rx.Observable.throw("Rest Error")) 
 
    .publishReplay(1) 
 
    .refCount() 
 
    .catch(error => Rx.Observable.empty()) 
 
    .finally(() => console.log("Calling Finally!")); 
 

 
res$.subscribe(console.info);
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>

+1

Gee, Sie scheinen richtig zu sein! Ich benutze 5.0.3. Scheint, dass das Anzeigen einer Nachricht in Ionic die Ladeanzeige blockiert ... Ich hätte console.log verwenden sollen, um es zu testen. Danke und entschuldigung :) – MiB

+0

Okay - vielleicht kannst du das Questin dann auch mit "Ionic" versehen und selbst eine Antwort geben, falls jemand anderes über das Problem stolpert :) – olsn

+1

Nun, dieses Problem scheint nicht so nützlich zu sein: Es stellt sich heraus Unsere App zeigte mehrere Ladeanzeigen, von denen einer nicht geschlossen wurde, weil der Aufruf von .finally() in diesem Stream tatsächlich fehlte. So funktioniert alles wie vorgesehen, das Problem lag vor der Tastatur .... – MiB

Verwandte Themen