обработка ошибки из Angular httpClient retryWhen block - PullRequest
0 голосов
/ 14 мая 2018

У меня довольно простой http-вызов. При ошибке я хочу, чтобы запрос повторился 3 раза с трехсекундной задержкой между попытками. Я разработал решение, которое близко:

return this.http.put<string>(URL,
               value).retryWhen(err => {
                    return err
                    .delay(3000)
                    .take(3)
                    .concat(Observable.throw("error occurred"));
                })
               .catch(err => this.handleHttpError(err)) ;

Клиент повторяет попытки три раза, как я ожидал. Однако я не знаю, как вызвать окончательную ошибку таким образом, чтобы мой обработчик ошибок (который обычно ожидает аргумент HttpResponse) мог обработать ошибку.

После того, как я взял (3), как я могу получить последнюю ошибку и преобразовать ее в HttpResponse для отправки моему обработчику? Или я смотрю на это не так?

Мне нужно знать, в конце концов, HttpResponse, который сопровождал ошибку (ы). Когда я выбрасываю ошибку из retryWhen в функции concat, которая, кажется, не выполняет ее.

Бьюсь об заклад, это довольно распространенная вещь, но, будучи новичком в Angular 5 и реагируя, я думаю, что просто скучаю по лодке.

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Для всех, кто сталкивался с этим, я смог перехватить httpErrorResponse, слегка изменив возвращаемый результат:

сначала я добавил локальную переменную

let httpError: HttpErrorResponse = null;

затем я изменил возврат:

 return error
          .do(err => {if (err instanceof HttpErrorResponse) {httpError = err; }})
          .delay(3000)
         .take(5)
         .concat(Observable.throw(error));
      })

это позволяет мне кэшировать последний http-ответ об ошибке. Я тогда ищу это в улове и работаю соответственно. Кажется, работает просто отлично.

0 голосов
/ 14 мая 2018

Вы можете использовать concatMap, чтобы подсчитать, сколько раз вы пытались повторить подписку и в соответствии с этим отправлять next или error уведомления (это означает повторное появление ошибки во внутренней наблюдаемой, которая распространяется далее) .

Observable.throw(42)
  .retryWhen(err => err
    .do(console.info) // remove, prints 42
    .delay(3000)
    .concatMap((error, index) => {
      if (index === 2) {
        return Observable.throw("error occurred"); // or Observable.throw(error);
      }
      return Observable.of(null);
    })
  )
  // .catch(err => handleHttpError(err))
  .subscribe(
    v => console.log('next', v), // not called
    e => console.log('error handler', e),
  );

Это печатает следующий вывод:

42
42
42
error handler: error occurred

Посмотреть демо: https://stackblitz.com/edit/rxjs5-jt5ald

...