angular2 / RxJS — как повторить попытку изнутри subscribe()

#angular #rxjs #observable #angular2-observables

#angular #rxjs #наблюдаемый #angular2-наблюдаемые

Вопрос:

это мой код:

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

в случае возникновения исключения оно будет отправлено в функцию в API, а затем возвращено true , если проблема устранена (например, обновлен токен, например), и ему просто нужно повторить попытку снова после ее устранения

Я не мог понять, как заставить его повторить попытку.

Ответ №1:

В вашем .getCompanies() вызове сразу после .map добавления .retryWhen :

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

В этом примере наблюдаемое завершается после 2 сбоев ( errorCount < 2 ).

Комментарии:

1. Я не уверен в том, как errors это выглядит. Я думаю, что это массив исключений (возможно?). Таким образом, вы могли бы расширить takeWhile условие до: errorCount < 2 amp;amp; this._api.responseErrorProcess(errors[0])

2. это то, что я собирался спросить, я проверю это, большое вам спасибо 🙂 на самом деле, таким образом я могу централизовать обработку ошибок напрямую из api, вместо добавления исключения в каждый подраздел, спасибо.!

3. Вы могли бы добавить console.log(errors) перед return , чтобы увидеть, как это структурировано.

Ответ №2:

Вы имеете в виду что-то вроде этого?

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

Комментарии:

1. ну, я думал, что есть способ повторить () наблюдаемое изначально из rxjs, но это тоже сработало бы, спасибо.

2. Имейте в виду, что этот пример может привести к взаимоблокировке.

3. При ближайшем рассмотрении также не повторяется фактический вызов сервера, просто вызывается функция обратного вызова : D