RXJS 6: новая версия HttpInterceptor - PullRequest
0 голосов
/ 22 мая 2018

Я нахожусь в процессе добавления rxjs_compat в мой проект, чтобы перейти к v6 библиотек.

Однако существующий HttpInterceptor для глобальной обработки ошибок больше не компилируется.Не уверен, куда идти с этим.Перепробовал все виды.Получение несоответствия типов со всем, что пыталось.

import { Injectable } from "@angular/core";
import {
  HttpEvent,
  HttpInterceptor,
  HttpHandler,
  HttpRequest,
  HttpResponse,
  HttpErrorResponse
} from "@angular/common/http";
import { Observable, of, empty } from "rxjs";
import { ToastrService } from "ngx-toastr";
import { environment } from "../../environments/environment";
import { catchError, map } from "rxjs/operators";

@Injectable()
export class HttpErrorInterceptor implements HttpInterceptor {
  constructor(private toastr: ToastrService) {}
  intercept(
    request: HttpRequest<any>,
    next: HttpHandler
  ): Observable<HttpEvent<any>> {
    return next.handle(request).pipe(
      catchError(err => of(HttpErrorResponse)),
      map(err => {
        let message: string;
         this.toastr.error(`${message}`, "Application Error");
        return Observable.empty<HttpEvent<any>>();
      })
    );
  }
}

src / app / shared / http-error-interceptor.ts (26,27): ошибка TS2339: Свойство 'empty' не существует для типаtypeof Observable.

empty теперь является константой, но не принимает тип, поэтому он тоже не работает.Также не удалось найти много в заметках об обновлении

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

, хотя интересно это компилирует:

return Observable.of<HttpEvent<any>>();

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Не удалось выяснить, как вернуть то, что принимает компилятор, но, по крайней мере, смог выдать ошибку.Код компилируется и работает, но как новичок в Rxjs не уверен, что он правильный.

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const xhr = req.clone({
      headers: req.headers.set('X-Requested-With', 'XMLHttpRequest')
    });
    return next.handle(xhr).pipe(
      catchError((err) => {
        if (err instanceof HttpErrorResponse) {
          if (err.status === 401) {
            this.router.navigate(['/login']);
          } else {
            this.snack.open('Communication error: ' + err.status + ' - ' + err.statusText, null,
             {duration: 5000, panelClass: 'snack-error', verticalPosition: 'top'});
          }
          return throwError('backend comm error');
        }
      })
    );
  }
0 голосов
/ 22 мая 2018
  1. import {EMPTY} from 'rxjs';

  2. Заменить возврат Observable.empty() на

    return EMPTY;

...