Как отобразить ошибку тайм-аута в Angular 8 - PullRequest
1 голос
/ 23 сентября 2019

Согласно этому ответу , я написал следующее Http Interceptor для установки времени ожидания.До сих пор отлично.Как я могу отобразить ошибку?или ( выдать предупреждение («тайм-аут соединения»); )

 import { Inject, Injectable, InjectionToken } from '@angular/core';
 import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
 import { Observable } from 'rxjs';
 import { timeout } from 'rxjs/operators';

 export const DEFAULT_TIMEOUT = new InjectionToken<number>('defaultTimeout');

 @Injectable()
 export class TimeoutInterceptor implements HttpInterceptor {
   constructor(@Inject(DEFAULT_TIMEOUT) protected defaultTimeout: number) {
   }

   intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
     const timeoutValue = req.headers.get('timeout') || this.defaultTimeout;
     const timeoutValueNumeric = Number(timeoutValue);

     return next.handle(req).pipe(timeout(timeoutValueNumeric));
   }
 }

РЕДАКТИРОВАТЬ:

, когда я использую pipe(tap()) тайм-аутне работает

Ответы [ 3 ]

2 голосов
/ 24 сентября 2019

Не меняйте перехватчик для обработки ошибки.Вы должны обработать ошибку в вашем компоненте / услуге.До сих пор для вашего состояния у вас есть два типа [TimeoutError / HttpErrorResponse] .

Ваша ошибка является экземпляром TimeoutError или HttpErrorResponse

В действии:

Импортируйте следующее:

import { HttpErrorResponse } from '@angular/common/http';
import { TimeoutError } from 'rxjs';

Тогда:

yourService.subscribe(response => {
  //do sth.successful Request
  }, (error: any) => {
  if (error instanceof TimeoutError) {
   //do sth
  }

  if (error instanceof HttpErrorResponse) {
   //do sth
  }
})
0 голосов
/ 23 сентября 2019
 return next.handle(request.clone({
            headers: new HttpHeaders({Authorization: 'Bearer ' + this.storage.get(storageKeys.token)})
        })).pipe(finalize(() => this.loaderService.hide()));

Я использую, чтобы скрыть мой загрузчик, используя приведенный выше код.Здесь вы можете заменить вызов loaderService.hide () для вашего метода, если время выходит за пределы заданного периода времени или если есть какое-либо исключение.

0 голосов
/ 23 сентября 2019

Попробуй так:

return next.handle(req)
  .pipe(
    tap(event => {

    }, error => {
      alert("connection timed out");

    })
  )
...