#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'))