ไม่มีคุณสมบัติ 'catch' ในประเภท 'Observable <any>'


127

ในหน้าเอกสาร Angular 2 สำหรับการใช้บริการ Http มีตัวอย่าง

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

ฉันโคลนโครงการangular2-webpack-starterและเพิ่มรหัสด้านบนด้วยตัวเอง

ฉันนำเข้าObservableโดยใช้

import {Observable} from 'rxjs/Observable';

ฉันสมมติว่าObservableมีการนำเข้าคุณสมบัติเช่นกัน (ใช้.mapงานได้) มองไปที่การเปลี่ยนแปลงสำหรับ rxjs.beta-6 catchและไม่มีอะไรจะกล่าวถึงเกี่ยวกับ

คำตอบ:


246

คำเตือน : โซลูชันนี้เลิกใช้แล้วตั้งแต่ Angular 5.5 โปรดดูคำตอบของ Trent ด้านล่าง

=====================

ใช่คุณต้องนำเข้าโอเปอเรเตอร์:

import 'rxjs/add/operator/catch';

หรือนำเข้าObservableด้วยวิธีนี้:

import {Observable} from 'rxjs/Rx';

แต่ในกรณีนี้คุณนำเข้าตัวดำเนินการทั้งหมด

ดูคำถามนี้สำหรับรายละเอียดเพิ่มเติม:


2
คุณรู้หรือไม่ว่าทำไมคุณสมบัติถึงไม่นำเข้าด้วยimport {Observable} from 'rxjs/Observable';? ดูเหมือนว่าจะใช้งานง่ายสำหรับฉัน
BrianRT

6
เนื่องจาก Rxjs ถูกออกแบบมาเช่นนี้ rxjs/Observableโมดูลไม่นำเข้าประกอบการเพราะมีจำนวนมากประกอบ rxjs/Rxการนำเข้าโมดูลทั้งหมด ... ผมคิดว่ามันเป็นทางเลือกการออกแบบ
Thierry Templier

4
การนำเข้าจาก rxjs / Rx โหลดหน้าเว็บช้าลงจริงๆ เปรียบเทียบจำนวนคำขอกับมัน v โดยไม่มี = ครึ่งหนึ่งของคำขอเมื่อคุณไม่ใช้ rxjs / Rx แต่ใช้ตัวอย่าง rxjs / Observable
danday74

การนำเข้า rxjs / Rx มักจะไม่เป็นขุยอีกต่อไป แต่เป็นการนำเข้าที่ขึ้นบัญชีดำ ฉันรู้ว่าในอดีตสิ่งนี้ถูกมองว่าโอเค (และฉันเคยทำมาแล้ว) แต่ในปัจจุบันมันไม่ควรเป็นส่วนหนึ่งของคำตอบที่ถูกต้องสำหรับสิ่งอื่นนอกจากการเล่นรอบ ๆ
Tim Consolazio

93

ด้วย RxJS 5.5+ catchตอนนี้โอเปอเรเตอร์เลิกใช้งานแล้ว ตอนนี้คุณควรใช้ประกอบการร่วมกับcatchErrorpipe

RxJS v5.5.2 เป็นเวอร์ชันอ้างอิงเริ่มต้นสำหรับ Angular 5

สำหรับตัวดำเนินการ RxJS แต่ละตัวที่คุณนำเข้ารวมถึงcatchErrorตอนนี้คุณควรนำเข้าจาก 'rxjs / operator' และใช้ตัวดำเนินการไปป์

ตัวอย่างการตรวจจับข้อผิดพลาดสำหรับคำขอ Http ที่สังเกตได้

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) => {
        ...
      }
    )
  }
  ...
}

โปรดสังเกตที่นี่ซึ่งcatchจะถูกแทนที่ด้วยcatchErrorและตัวpipeดำเนินการจะใช้ในการเขียนตัวดำเนินการในลักษณะเดียวกับที่คุณคุ้นเคยกับการต่อจุด


ดูเอกสาร rxjs เกี่ยวกับตัวดำเนินการ pipable (ก่อนหน้านี้เรียกว่าlettable ) สำหรับข้อมูลเพิ่มเติม


ถูกmap(res => res)ต้อง?
Pieter De Bie

1
ไม่pipeฟังก์ชั่นRxJS ช่วยให้คุณรวมหลายฟังก์ชันไว้ในฟังก์ชันเดียว ฟังก์ชัน pipe () ใช้เป็นอาร์กิวเมนต์ของฟังก์ชันที่คุณต้องการรวมและส่งกลับฟังก์ชันใหม่ที่เมื่อเรียกใช้ฟังก์ชันที่ประกอบด้วยตามลำดับ การทำแผนที่นั้นไม่ได้ทำอะไรเลยเนื่องจากเป็นฟังก์ชันเอกลักษณ์ทางเทคนิค
Trent

1
In angular 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');
  }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.