2016-10-21 1 views
5

dies ist mein Code:angular2/RxJS - wie erneut zu versuchen, von innen subscribe()

this._api.getCompanies().subscribe(
    res => this.companies = JSON.parse(res), 
    exception => {if(this._api.responseErrorProcess(exception)) { // in case this retured TRUE then I need to retry() } } 
) 

, falls eine Ausnahme passiert ist, wird es dann true auf eine Funktion in der API gesendet werden zurückkehren, wenn das Problem ist, behoben (wie zum Beispiel token refreshed) und es muss nur noch einmal nach seiner festen

Ich konnte nicht herausfinden, wie man es erneut versuchen.

Antwort

6

In Ihrem .getCompanies() Anruf direkt nach dem .map eine .retryWhen hinzufügen:

.retryWhen((errors) => { 
    return errors.scan((errorCount, err) => errorCount + 1, 0) 
       .takeWhile((errorCount) => errorCount < 2); 
}); 

In diesem Beispiel sind die beobachtbaren abgeschlossen ist nach 2 Fehlern (errorCount < 2).

+0

Ich bin mir nicht sicher, wie "Fehler" aussieht. Ich denke, es ist eine Reihe von Ausnahmen (vielleicht?). Also könntest du die 'takeWhile'-Bedingung auf' errorCount <2 && this._api.responseErrorProcess (errors [0]) ' – rinukkusu

+1

erweitern Auf diese Weise kann ich die Fehlerbehandlung direkt von der API aus zentralisieren, anstatt die Ausnahme in jeder Subdatei hinzuzufügen, vielen Dank. –

+1

Sie können eine 'console.log (errors)' vor dem 'return' hinzufügen, um zu sehen, wie es strukturiert ist. – rinukkusu

0

Sie meinen so etwas?

this._api.getCompanies().subscribe(this.updateCompanies.bind(this)) 

updateCompanies(companies, exception) { 
    companies => this.companies = JSON.parse(companies), 
    exception => { 
     if(this._api.responseErrorProcess(exception)) { 
      // in case this retured TRUE then I need to retry() 
      this.updateCompanies(companies, exception) 
     } 
    } 
} 
+0

Nun, ich dachte, es gibt eine Möglichkeit, das Observable nativ von Rxjs zu wiederholen, aber das würde auch funktionieren, danke. –

+1

Beachten Sie, dass dieses Beispiel möglicherweise blockiert werden kann. – rinukkusu

+0

ich werde einen Zähler machen Danke für die heads-up –

Verwandte Themen