Ich verwende Angular 2 und RxJS, um Daten von meiner API-Schicht abzurufen. Ich habe einen Basisdienst, den ich geschrieben habe, um mit HTTP-Anfragen umzugehen. Der folgende Code tut dies in meinem Dienst:Wie wiederhole ich eine beobachtbare Aktion nach dem Ausführen einer Aktion in RxJs?
protected apiGet(uri: string): Observable<HttpMappedResponse<T>> {
return this.mapAndHandle<T>(this.http.get(uri));
}
private mapAndHandle<T>(observable: Observable<Response>): Observable<HttpMappedResponse<T>> {
const o = observable
.map(res => {
const data = res.json() || {};
const mappedResponse = new HttpMappedResponse<T>(res, data);
// Retrieve page information from HTTP headers
mappedResponse.pageInfo = new PageInfo(res.headers);
return mappedResponse;
})
.share();
o.subscribe(null, e => this.errorService.handleHttpResponse(e));
return o;
}
Das funktioniert gut und gibt mir alle Daten, die ich brauche, wenn ich apiGet()
nennen. Was ich jetzt zu tun versuchen, ist die folgende:
- Senden Sie eine HTTP-Anfrage
- Wenn ein 401-Fehler mit einer bestimmten Zeichenfolge zurückgegeben:
- eine weitere Anforderung an eine andere URL senden
- aktualisieren Retry einen anderen Dienst
- die ursprüngliche Anforderung
- (dann wohl Logik hinzufügen möglich unendliche Wiederholungen zu handhaben)
- Else
- Rethrow der ursprünglichen http Fehler
- Capture-Fehler und handhaben es
Ich habe versucht, mit .catch(), .retryWhen(), .map() und .flatMapTo() ohne Erfolg - am nächsten ist Folgendes:
Aber das gibt mir nicht die richtigen Ergebnisse.
Gibt es einen Operator, den ich verwenden kann, um dies zu tun? retryWhen() scheint das logischste zu sein, aber ich bringe mich immer wieder in ein Chaos mit RxJs!
Lassen Sie mich wissen, ob meine Antwort Sie in die richtige Richtung führt. Es ist alles Pseudocode, aber es sollte Ihnen eine allgemeine Vorstellung davon geben, was Sie tun können (Sie kennen bereits die Schritte, die Sie unternehmen müssen). Verwenden Sie einfach 'flatMap', wenn Sie Ihre Anfrage wiederholen, und Sie können sie im selben beobachtbaren Stream behalten. – Lansana