#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