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);
}
});
}
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);
}
})
);
}
import 'rxjs/add/operator/catch';
Oder importieren Sie Observable auf diese Weise:
import {Observable} from 'rxjs/Rx';
sie müssen alle von Ihnen verwendeten Operatoren importieren.
import 'rxjs/add/observable/of';
import 'rxjs/add/observable/throw';
import 'rxjs/add/operator/catch';
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.
Der Fangoperator muss importiert werden
import 'rxjs/add/operator/catch';
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';
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[]>([]);
}));