Повторите подписку, когда результат ложен - PullRequest
0 голосов
/ 29 марта 2019

Я хочу продолжать повторную попытку вызова на сервер (чтобы узнать, возвращает ли он значение true).

В моем сервисе я создал http-вызов, который возвращает true, если он смог получить значение, и возвращает false, если он не смог получить значение (и, таким образом, получил ошибку).

public retryServerCheck(): Observable<boolean> {
 return this._httpClient.get<boolean>(this.baseUrl + 'ServerCheck')
  .pipe(
    map(() => true),
    catchError(() => of(false)
    ));
}

В моем компоненте я хочу повторить это, пока не вернусь true, и в этом заключается моя проблема.

this._serverService.retryServerCheck()
  .subscribe(
    (isOnline) => {
      if (isOnline) {
        this._helperServer.navigateToComponent('Login', undefined, 0);
        console.log('online');
      } else {
        this.lastRetry = 'A little later...';
        console.log('offline');
      }
    }
  );

Я попытался добавить трубу перед подписчиком, но безуспешно

this._serverService.retryServerCheck()
  .pipe(
    retry(10),
    delay(100)
  ).subscribe(
    (isOnline) => {
      if (isOnline) {
        this._helperServer.navigateToComponent('Login', undefined, 0);
        console.log('online');
      } else {
        this.lastRetry = 'A little later...';
        console.log('offline');
      }
    }
  );

Я смог повторить попытку в моем сервисе, но потом я не смог отреагировать на это в моем компоненте

 public retryServerCheck(): Observable<boolean | HttpError> {
  return this._httpClient.get<boolean>(this.baseUrl + 'ServerCheck')
    .pipe(
      retryWhen(errors => errors.pipe(delay(500))),
      catchError(err => {
        return this._helperService.handelHttpError(err);
      })
    );
}

1 Ответ

1 голос
/ 29 марта 2019

И catchError, и retryWhen будут подавлять ошибки в потоке.Так что в компоненте ошибки уже обработаны.

Попробуйте либо сделать retryWhen ответственным за обработку количества повторных попыток

// service
public retryServerCheck() {
  return this._httpClient.get(this.baseUrl + 'ServerCheck').pipe(
    retryWhen(error$ => error$.pipe(
      take(10),   // <-- number of retries
      delay(500),
      concat(
        /* either throw your own error */
        throwError('no more retries left')
        /* or to pass original error -- use `NEVER` */
        // NEVER
      )
    ))
  )
}

// component
this._serverService.retryServerCheck()
  .subscribe({
    next: (result) => {
      // succeeded
    },
    error: (error)=> {
      // failed
    }
  });

Запустите этот пример

ИЛИ добавление expand к компоненту - для повторной попытки при наличии false в потоке.

Подробнее о Обработка ошибок rxjs и особенности retryWhen

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...