首页 文章

在Observable <Response>中找不到catchError

提问于
浏览
0

我试图从HTTP请求中捕获错误并基于错误代码我向用户显示错误消息 . 为了实现这一点,我使用rxjs中的catchError运算符 .

但我得到这个错误,表明 Property 'catchError' does not exist on type Observable < Response >

Follwing是我的package.json

"dependencies": {
"@angular/animations": "^6.0.3",
"@angular/common": "^6.0.3",
"@angular/compiler": "^6.0.3",
"@angular/core": "^6.0.3",
"@angular/forms": "^6.0.3",
"@angular/http": "^6.0.3",
"@angular/platform-browser": "^6.0.3",
"@angular/platform-browser-dynamic": "^6.0.3",
"@angular/router": "^6.0.3",
"bootstrap": "^3.3.7",
"core-js": "^2.5.4",
"rxjs": "^6.0.0",
"zone.js": "^0.8.26"

以下是我在实现处理http请求的服务中使用的导入 .

import { catchError } from 'rxjs/operators';
import { Injectable } from '@angular/core';
import { Http } from '../../../node_modules/@angular/http';
import { Observable } from 'rxjs';
import { AppError } from './../common/app-error';
import { NotFoundError } from '../common/not-found-error';

这是我从服务器删除帖子并将预期错误和意外错误的自定义错误返回给我的组件的功能 .

deletePost(id:number){
return this.http.delete(this._url+"/"+id).catchError(
  (error:Response)=>{
    if(error.status===404){
      return Observable.throw(new NotFoundError());
    }
    return Observable.throw(new AppError(error));
  }
);

}

但是当我尝试删除帖子时,我收到以下错误 .

this.http.delete(...).catchError is not a function

我在那里引用了以下API for rxjs,根据我的理解,catchError函数需要一个Observable作为输入 . 如果有人可以帮我解决这个问题,我将非常感激 . 谢谢 .

1 回答

  • 0

    我想到了 . 我需要使用pipe()运算符才能使用来自rxjs 6之类的catchError之类的运算符 . 因此,代码应该如下修改 .

    deletePost(id:number){
    return this.http.delete(this._url+"/"+id)
    .pipe(
      catchError(
        (error:Response)=>{
          if(error.status===404){
            return Observable.throw(new NotFoundError());
          }
          return Observable.throw(new AppError(error));
        }
    ));}
    

    UPDATE

    由于throw函数实现也随rxjs6而改变,因此需要稍微更改以使其正常工作 . 现在代替来自observable的throw error函数必须使用throwError()函数 . 上述任务的实现如下 .

    deletePost(id:number){
    return this.http.delete(this._url+"/"+id)
    .pipe(
      catchError(
        (error:Response)=>{
          if(error.status===404){
            console.log(error);
            return throwError(new NotFoundError(error));
          }
          return throwError(new AppError());
        }
    ));}
    

    我希望有人会发现这有用,并节省几个小时的时间 . 干杯!

相关问题