20

我正在将我的应用程序升级到Angular 6。我正在从Angular 4升级,但下面的代码在 Angular 6 中导致错误,它在 Angular 4 中运行良好。


我得到的错误:

“typeof Observable”类型上不存在属性“of”

错误:“Observable”类型上不存在属性“catch”

我应该如何解决这些错误?

  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);
      }
    });
  }
4

8 回答 8

52

由于您标记了您的问题 rxjs6,我假设升级到 Angular 6 包括升级到 rxjs6。在这种情况下,它不起作用,因为可观察对象上的方法现在是可以使用 pipe() 应用的独立运算符。此外,进口也发生了变化。有关更多详细信息,请参阅迁移指南

使用 rxjs6 它应该看起来像这样:

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);
            }
       })
   );
 }
于 2018-06-21T13:00:34.930 回答
3
import 'rxjs/add/operator/catch';

或者以这种方式导入 Observable:

import {Observable} from 'rxjs';
于 2018-06-21T11:27:12.423 回答
2

我假设您已迁移到 RXJS6,因为您也已迁移到 angular6。

在 RXJS6 中使用 catch Error 而不是 catch 如此处所示

  import {catchError } from 'rxjs/operators';
  import { Observable, of } from 'rxjs';
于 2018-06-21T15:54:10.073 回答
2

使用以下方法导入库并重新排列代码

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

这对我有用。

于 2018-06-27T14:27:26.707 回答
1

需要导入 catch 操作符

import 'rxjs/add/operator/catch';
于 2018-06-21T11:22:56.817 回答
1

您将需要导入您正在使用的所有运算符。

import 'rxjs/add/observable/of';
import 'rxjs/add/observable/throw';
import 'rxjs/add/operator/catch';
于 2018-06-21T11:28:51.297 回答
1

首先使用以下命令安装 rxjs 包

npm i rxjs-compat

然后使用导入库

import 'rxjs/add/operator/catch';

或者以这种方式导入 Observable:

import {Observable} from 'rxjs/Rx';

但在这种情况下,您导入所有运算符。

从以下链接获得 https://code-examples.net/en/q/235b329

于 2019-12-01T12:57:37.070 回答
0

这对我有用,我正在使用 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[]>([]);
  }));
于 2019-02-18T23:49:10.493 回答