Повторите запрос, если получите пустой результат из http.get Angular с операторами RJXS - PullRequest
1 голос
/ 01 октября 2019

У меня есть запрос в службе Angular, иногда я получаю пустой массив и хочу заставить запрос повториться в этом случае

let request = this.http.post(this.searchlUrl, payload).pipe(
          retryWhen(errors => errors.pipe(delay(1000), take(2), concat(throwError("Error Data")))), 
          map( res => {
            // If receive res['hotels'] == [] I want to force error
            return res; 
          })
        ).subscribe(res => {
            // Do Something when everything is ok
        }, err => {
            // Do Something on error
        });
      });

Я работаю с retryWhen для создания новогозапросить, если есть ошибка (жду 1 секунду). Мой подход заключается в том, чтобы вызвать ошибку при получении пустого, чтобы активировать RetryWhen, но я не знаю, как это сделать, и я не знаю, каков наилучший метод принудительного повторного консультирования при получении пустого.

Ответы [ 2 ]

1 голос
/ 01 октября 2019

Основная проблема - порядок операторов. retryWhen реагирует только на error уведомления, поэтому вам нужно выдать ошибку до retryWhen:

this.http.post(this.searchlUrl, payload).pipe(
  map(response => {
    if (something) {
      throw new Error(); // Will be caught by `map` and reemitted as an error notification.
    }
    return response;
  }),
  retryWhen(errors => errors.pipe(take(2), delay(1000))),
).subscribe(...);

Демонстрационная версия: https://stackblitz.com/edit/rxjs-cmh1wd

0 голосов
/ 01 октября 2019

Вот простой пример операции повтора, которая может помочь вам в пути. Я использую of для создания наблюдаемого. Замените его своим вызовом API.

private resultToReturn: string[] = [];

  ngOnInit() {
    var request = 
      of(this.resultToReturn).pipe(
        map(result => {
          if (result.length === 0) {
            this.resultToReturn.push("some value");
            console.log("Didn't get any data!")
            throw new Error();
          }
          return result;
        }),
        retryWhen(errors => {
          console.log("Retrying!")
          return of(this.resultToReturn)})
      );

      request.subscribe(x => console.log(x[0]));
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...