6

this is my code:

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

in case an exception happened, it will be sent to a function in the API then return true if the problem is fixed (like token refreshed for example) and it just needs to retry again after its fixed

I could not figure out how to make it retry.

Motassem Kassab
  • 1,744
  • 4
  • 21
  • 40

2 Answers2

6

In your .getCompanies() call right after the .map add a .retryWhen:

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

In this example, the observable completes after 2 failures (errorCount < 2).

Maximilian Riegler
  • 22,720
  • 4
  • 62
  • 71
  • I'm not sure about how `errors` looks like. I think it's an array of exceptions (maybe?). So you could extend the `takeWhile` condition to: `errorCount < 2 && this._api.responseErrorProcess(errors[0])` – Maximilian Riegler Oct 21 '16 at 11:38
  • 1
    this is what I was gonna ask, I'll check it up thank you a lot :) actually this way I can centralize the error handling from the api directly, instead of adding the exception in each subsribtion, thank you.! – Motassem Kassab Oct 21 '16 at 11:41
  • 2
    You could add a `console.log(errors)` before the `return` to see how it's structured. – Maximilian Riegler Oct 21 '16 at 11:41
0

You mean something like this?

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)
        }
    }
}
Yaroslav Grishajev
  • 2,127
  • 17
  • 22