类型'Observable <any>'中不存在属性'catch'

Bri*_*nRT 120 javascript rxjs typescript angular

在Angular 2文档页面上有一个使用Http服务的例子.

getHeroes (): Observable<Stuff[]> {
  return this.http.get(this.url)
                  .map(this.extractData)
                  .catch(this.handleError);
}
Run Code Online (Sandbox Code Playgroud)

我克隆了angular2-webpack-starter项目并自己添加了上面的代码.

我导入Observable使用

import {Observable} from 'rxjs/Observable';
Run Code Online (Sandbox Code Playgroud)

我假设属性Observable也被导入(.map有效).查看rxjs.beta-6的更改日志,没有提到任何内容catch.

Thi*_*ier 239

是的,您需要导入运营商:

import 'rxjs/add/operator/catch';
Run Code Online (Sandbox Code Playgroud)

或者以Observable这种方式导入:

import {Observable} from 'rxjs/Rx';
Run Code Online (Sandbox Code Playgroud)

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

有关详细信息,请参阅此问题:

  • 因为Rxjs是这样设计的.`rxjs/Observable`模块不会导入运算符,因为有很多运算符.`rxjs/Rx`模块导入所有...我认为这是一个设计选择. (6认同)
  • 从rxjs/Rx导入确实减慢了页面加载速度.比较请求计数与它v没有=一半请求当你不使用rxjs/Rx但使用例如rxjs/Observable (4认同)
  • 你知道为什么不用'rxjs/Observable'中的`import {Observable}导入属性;`?这对我来说似乎更直观. (2认同)

Tre*_*ent 81

使用RxJS 5.5+,catch运算符现已弃用.您现在应该catchError结合使用运算符pipe.

RxJS v5.5.2是Angular 5的默认依赖版本.

对于您导入的每个RxJS运算符,包括catchError您现在应该从'rxjs /运算符'导入并使用管道运算符.

捕获Http请求Observable的错误示例

import { Observable } from 'rxjs';
import { catchError } from 'rxjs/operators';
...

export class ExampleClass {
  constructor(private http: HttpClient) {
    this.http.request(method, url, options).pipe(
      catchError((err: HttpErrorResponse) => {
        ...
      }
    )
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

请注意,这里catch替换为catchErrorpipe运算符用于组合运算符的方式与您用于点链的方式类似.


查看该rxjs文档pipable(以前称为可出租获取更多信息)运营商.


小智 9

在角度 8 中:

//for catch:
import { catchError } from 'rxjs/operators';

//for throw:
import { Observable, throwError } from 'rxjs';

//and code should be written like this.

getEmployees(): Observable<IEmployee[]> {
    return this.http.get<IEmployee[]>(this.url).pipe(catchError(this.erroHandler));
  }

  erroHandler(error: HttpErrorResponse) {
    return throwError(error.message || 'server Error');
  }
Run Code Online (Sandbox Code Playgroud)