Периодический вызов API проверки работоспособности в Angular

#angular

#угловатый #angular

Вопрос:

Я новичок в angular и пытаюсь создать подключение для проверки работоспособности, чтобы проверить доступность моего бэкэнд-обмена мгновенными сообщениями. Эта проверка будет выполняться периодически каждые 5 секунд, чтобы проверить, получен ли статус 200 OK:

Вот моя служба:

 healthCheck() {
    return this.http.get<any>(this.healthCheckAPI, { observe: 'response' })
      .pipe(
        map((resp: any) => {
          if(resp.status !== 200){
            throw resp;
          }
          return resp.status;
        }),
        repeatWhen(() => interval(5000)),
        retryWhen(errors => errors.pipe(delay(5000)))
      );
  }
  

И вот внутри моего компонента:

 this.apiService.healthCheck().subscribe(
      (data) => {
        //perform some stuff when 200 is returned
      },
      (error) => {
        //perform some stuff when error is returned
      }
    );
  

В subscribe() методе в моем компоненте я успешно получил статус 200 при успешной проверке работоспособности, но почему я никогда не получаю сообщение об ошибке в моем методе подписки, даже когда серверная часть недоступна? Я думал, что в этом случае служба вызовет retryWhen() в фоновом режиме и вернет ошибку компоненту, чтобы я мог выполнить там какую-то операцию, или я что-то пропустил?

Ответ №1:

Операторы retryWhen и retry не будут выдавать error уведомление. Это снова вызовет observable и будет ждать следующего уведомления.

Если вы хотите что-то сделать с уведомлением об ошибке в компоненте и все еще используете retryWhen оператор, вы можете переместить обратные вызовы подписки на tap оператора перед подпиской.

Обслуживание

 healthCheck() {
  return this.http.get<any>(this.healthCheckAPI, { observe: 'response' }).pipe(
    map((resp: any) => {
      if(resp.status !== 200){
        throw resp;
      }
      return resp.status;
    }),
    repeatWhen(() => interval(5000))
  );
}
  

Компонент

 this.apiService.healthCheck().pipe(
  tap(
    (data) => {
      // perform some stuff when 200 is returned
    },
    (error) => {
      // perform some stuff when error is returned
    }
  ),
  retryWhen(errors => errors.pipe(delay(5000)))
).subscribe();
  

Однако обратите внимание, что при таком подходе существует множество проблем

  • Люди обычно не одобряют полагаться на tap operator.
  • retryWhen Теперь находится на уровне компонентов. Таким образом, каждая подписка должна передавать ее по отдельности, чтобы повторить запрос.

Ответ №2:

Вы можете выполнять проверку каждые 5 секунд с помощью interval() .

Это может быть похоже :

 interval(5000)
  .pipe(switchMap(this.apiService.healthCheck()))
  .subscribe((success) => {console.log('up')}, error => console.err('down'))