Thuộc tính 'bắt' không tồn tại trên loại 'Có thể quan sát <any>'


127

Trên trang tài liệu Angular 2 để sử dụng dịch vụ http, có một ví dụ.

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

Tôi đã nhân bản dự án angular2-webpack-starter và tự thêm mã ở trên.

Tôi đã nhập Observablebằng

import {Observable} from 'rxjs/Observable';

Tôi giả sử các thuộc tính Observablecũng được nhập khẩu ( .maphoạt động). Nhìn vào thay đổi cho rxjs.beta-6 và không có gì được đề cập catch.

Câu trả lời:


246

Cảnh báo : Giải pháp này không được chấp nhận kể từ Angular 5.5, vui lòng tham khảo câu trả lời của Trent bên dưới

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

Có, bạn cần nhập toán tử:

import 'rxjs/add/operator/catch';

Hoặc nhập Observabletheo cách này:

import {Observable} from 'rxjs/Rx';

Nhưng trong trường hợp này, bạn nhập tất cả các nhà khai thác.

Xem câu hỏi này để biết thêm chi tiết:


2
Bạn có biết tại sao các tài sản không được nhập khẩu với import {Observable} from 'rxjs/Observable';? Điều đó có vẻ trực quan hơn với tôi.
BrianRT

6
Bởi vì Rxjs được thiết kế như thế này. Các rxjs/Observablemô-đun không nhập khai thác bởi vì có rất nhiều nhà khai thác. Các rxjs/Rxmô-đun nhập khẩu tất cả ... Tôi nghĩ rằng đó là một sự lựa chọn thiết kế.
Thierry Templier

4
nhập từ rxjs / Rx tải trang thực sự chậm. so sánh số lượng yêu cầu với nó v mà không có = một nửa số yêu cầu khi bạn không sử dụng rxjs / Rx nhưng sử dụng ví dụ rxjs / Observable
danday74

Việc nhập rxjs / Rx thường xuyên thậm chí sẽ không còn nữa, đó là nhập khẩu trong danh sách đen. Tôi biết trong quá khứ điều này được coi là loại ok (và tôi đã làm nó), nhưng ngày nay nó không bao giờ là một phần của câu trả lời chính xác cho bất cứ điều gì khác ngoài chơi xung quanh.
Tim Consolazio

93

Với RxJS 5.5+, catchnhà điều hành hiện không dùng nữa. Bây giờ bạn nên sử dụng catchErrortoán tử kết hợp với pipe.

RxJS v5.5.2 là phiên bản phụ thuộc mặc định cho Angular 5.

Đối với mỗi Toán tử RxJS mà bạn nhập, bao gồm cả catchErrorbạn nên nhập từ 'rxjs / toán tử' và sử dụng toán tử đường ống.

Ví dụ về lỗi bắt cho một yêu cầu http Có thể quan sát được

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

Lưu ý ở đây catchđược thay thế bằng catchErrorpipetoán tử được sử dụng để soạn các toán tử theo cách tương tự như những gì bạn đã sử dụng với chuỗi chấm.


Xem tài liệu rxjs về pipable (trước đây gọi là lable toán tử có thể điều ) để biết thêm thông tin.


được map(res => res)yêu cầu?
Pieter De Bie

1
Không, pipechức năng RxJS cho phép bạn kết hợp nhiều chức năng thành một chức năng. Hàm pipe () lấy tham số của nó là các hàm bạn muốn kết hợp và trả về một hàm mới, khi được thực thi, sẽ chạy các hàm tổng hợp theo thứ tự. Ánh xạ đó không làm gì cả, vì về mặt kỹ thuật nó là một chức năng nhận dạng.
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');
  }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.