首页 文章

可观察的.catch不是一个函数

提问于
浏览
8

从unix环境运行我的代码时,我遇到了这个非常烦人的错误 . 当我通过 ng serve 在本地运行代码时,这工作正常,但是当我将代码部署到我的服务器时,此错误会暂停所有程序执行:

ERROR TypeError:this.http.get(...) . catch不是函数

谷歌的结果表明我应该直接从他们的位置导入rxjs名称空间,而不是通过rxjs / Rx包,但是我得到这个错误 . 其他结果指出我可能错过了导入rxjs运算符,但它们肯定包含在我的情况中 .

我甚至使用DevTools检查了包含的源图,并且操作符包含在浏览器中 .

谁能告诉我为什么我会收到这个错误?我正在使用rxjs:^ 5.5.2

This is my code.

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';

@Injectable()
export class MyService {
  constructor(private http: HttpClient) {}

  all(): Observable<any> {
    return this.http.get<any>('url')
      .catch(err => this.handleError(err));
  }
  handleError(error) {
    return Observable.throw(error);
  }
}

EDIT 基于@ Jota.Toledo的评论,我将使用此方法提供代码:

this.myService.all().subscribe(
  result => {
    this.isLoading = false;
    if (result) {
      this.clients = result;
    }
  },
  error => this.isLoading = false
);

在订阅中给出两个回调函数,就像在添加运算符之前“在某处使用catch方法”一样?

1 回答

  • 11

    rxjs 5.5.2 中,您可以使用lettable运算符解决此问题,在本例中为 catchError . 您必须从 operators 导入它,如: import { catchError } from 'rxjs/operators/catchError'; . 通常,必须以这种方式导入所有运算符, observableobservable/of 相同 .

    import { catchError } from 'rxjs/operators/catchError';
    import { map } from 'rxjs/operators/map';
    
    all(): Observable<any> {
      return this.http.get<any>('url')
        .pipe(
            map(() => //do stuff),
            catchError((error: Error) => {
             //
            })
        )
    }
    

    阅读更多关于可投放运营商的信息here .

相关问题