Как оправиться от ошибок в 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"));
  }
}

http://jsbin.com/naroyeyive/3/edit?js,console

1 ответ

Решение

Если вы хотите отправить запрос еще раз, вы можете посмотреть в retry а также retryWhen вместо catch,

catch будет использовать возвращенный Observable как новый "источник". Посмотрите эту корзину для примера.

retry(When) будет "переподписываться" всякий раз, когда возникает ошибка, в зависимости от конфигурации, которую вы передаете операторам. Вы можете найти примеры и дополнительную информацию здесь: https://www.learnrxjs.io/operators/error_handling/retrywhen.html

Другие вопросы по тегам