it-swarm.com.de

Winkel 6: Eigenschaft 'catch' existiert nicht bei Typ 'Observable <Response>'

Ich aktualisiere meine App auf Angular 6 . Ich aktualisiere von Angular 4 , aber der folgende Code verursacht Fehler in Angular 6, wo es in Angular 4 gut funktioniert. 


Die Fehler, die ich bekomme:

Die Eigenschaft 'von' ist bei Typ 'typeof Observable' nicht vorhanden

Fehler: Die Eigenschaft 'catch' ist beim Typ 'Observable' nicht vorhanden.

Wie soll ich diese Fehler beheben? 

  private authInterceptor(observable: Observable<Response>): Observable<Response> {
    return observable.catch((error, source) => {
      if (error.status == 401) {
        this.router.navigateByUrl('/login');
        return Observable.of();
      } else {
        return Observable.throw(error);
      }
    });
  }
11
Shubham Verma

Da Sie Ihre Frage mit rxjs6 markiert haben, gehe ich davon aus, dass das Upgrade auf Angular 6 ein Upgrade auf rxjs6 beinhaltet. In diesem Fall funktioniert es nicht, da die Methoden für das beobachtbare Objekt nun eigenständige Operatoren sind, die Sie mithilfe von pipe () anwenden können. Auch die Importe haben sich geändert. Weitere Informationen finden Sie im migration guide .

Bei rxjs6 sollte es ungefähr so ​​aussehen:

import { Observable, EMPTY, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';

private authInterceptor(observable: Observable<Response>): Observable<Response> {
   return observable.pipe(
       catchError( err => {
            if (err.status == 401) {
                this.router.navigateByUrl('/login');
                return EMPTY;
            } else {
                return throwError(err);
            }
       })
   );
 }
31
Joakim
import 'rxjs/add/operator/catch';

Oder importieren Sie Observable auf diese Weise:

import {Observable} from 'rxjs/Rx';
3
AashishJ

sie müssen alle von Ihnen verwendeten Operatoren importieren.

import 'rxjs/add/observable/of';
import 'rxjs/add/observable/throw';
import 'rxjs/add/operator/catch';
2
Mike

Importieren Sie die Bibliothek mit der folgenden Methode und ordnen Sie den Code neu an

import { catchError } from 'rxjs/operators';
return Observable.pipe(catchError =>...);

Das hat bei mir funktioniert.

1
Susampath

Der Fangoperator muss importiert werden 

import 'rxjs/add/operator/catch';
1

Ich gehe davon aus, dass Sie zu RXJS6 gewechselt sind, seit Sie auch zu angle6 gewechselt sind.

In RXJS6 verwenden Sie catch Error anstelle von catch wie gesehen hier

  import {catchError } from 'rxjs/operators';
  import { Observable, of } from 'rxjs';
1

Dies funktionierte für mich, ich benutze Angular 6.1.0.

import { Observable, Subject, of } from 'rxjs';
import { switchMap, debounceTime, distinctUntilChanged, catchError } from 'rxjs/operators';

this.ofertas = this.subjectPesquisa // Retorno Oferta[]
  .pipe(debounceTime(1000)) // Executa a ação do switchMap após 1 segundo
  .pipe(distinctUntilChanged()) // Apenas executa a ação switchMap se o termo enviado for outro
  .pipe(switchMap((termo: string) => {

    if (termo.trim() === '') {
      // Retornar um observable de array de ofertas vazio.
      return of<Oferta[]>([]);
    }

    console.log('Requisição HTTP para api: ', termo);
    return this.ofertasService.pesquisaOfertas(termo);
  }))
  .pipe(catchError((err: any) => {
    console.log('Erro: ', catchError);
    return of<Oferta[]>([]);
  }));
0
Eduardo Yuidy