Как оправиться от ошибок в rxjs?
Я пытаюсь понять, как использовать наблюдаемые последовательности и как восстанавливаться после ошибок.
Мой пример немного надуманный, но моя реальная реализация слишком сложна, чтобы показывать здесь. Во всяком случае, у меня есть someObservable
который выдает значения, когда пользователь щелкает в интерфейсе пользователя. Это должно вызвать запрос к API (GET/POST/etc). Проблема в том, что если API возвращает ошибку, postData
больше не вызывается после этого.
Я сделал здесь пример, который показывает проблему. Я обнаружил, что могу использовать Rx.Observable.of
вместо Rx.Observable.throw
чтобы все продолжалось. Но это будет излучать ценность для subscribe
функция. И в моем реальном приложении postData
это сервис, который повторно используется несколькими частями приложения, и я не уверен, что хочу использовать of
вместо throw
там.
Итак, мой вопрос, как вы обычно справляетесь с такими вещами?
let someObservable = Rx.Observable.timer(1, 1000);
someObservable
.switchMap(data => {
return postData(data);
})
.catch(error => {
console.log("POST failed");
})
.subscribe(val => console.log("Success: " + val));
function postData(data) {
console.log("Will post " + data);
if (data !== 2) {
return Rx.Observable.of(true);
}
else {
return Rx.Observable.throw(new Error("400 Bad Request or something"));
}
}
1 ответ
Если вы хотите отправить запрос еще раз, вы можете посмотреть в retry
а также retryWhen
вместо catch
,
catch
будет использовать возвращенный Observable
как новый "источник". Посмотрите эту корзину для примера.
retry(When)
будет "переподписываться" всякий раз, когда возникает ошибка, в зависимости от конфигурации, которую вы передаете операторам. Вы можете найти примеры и дополнительную информацию здесь: https://www.learnrxjs.io/operators/error_handling/retrywhen.html