'Catch' özelliği 'Observable <any>' türünde mevcut değil


127

Http hizmetini kullanmak için Angular 2 dokümantasyon sayfasında bir örnek var.

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

Ben klonlanmış angular2-webpack-marş projesini ve yukarıdaki kodu kendim ekledi.

ObservableKullanarak ithal ettim

import {Observable} from 'rxjs/Observable';

Mülklerin Observablede ithal edildiğini varsayıyorum ( .mapişler). Rxjs.beta-6 için değişiklik günlüğüne bakıldı ve hakkında hiçbir şeyden bahsedilmedi catch.

Yanıtlar:


246

Uyarı : Bu çözüm, Angular 5.5'ten beri kullanımdan kaldırılmıştır, lütfen aşağıdaki Trent'in yanıtına bakın

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

Evet, operatörü içe aktarmanız gerekiyor:

import 'rxjs/add/operator/catch';

Veya Observableşu şekilde içe aktarın :

import {Observable} from 'rxjs/Rx';

Ancak bu durumda, tüm operatörleri içe aktarırsınız.

Daha fazla ayrıntı için bu soruya bakın:


2
Mülklerin neden ithal edilmediğini biliyor musunuz import {Observable} from 'rxjs/Observable';? Bu bana daha sezgisel geliyor.
BrianRT

6
Çünkü Rxjs böyle tasarlandı. rxjs/ObservableOperatörlerin bir yeri vardır, çünkü modül operatörlerini içe aktarmaz. rxjs/RxModül ithalatı tüm ... Ben bir tasarım seçimi olduğunu düşünüyorum.
Thierry Templier

4
rxjs / Rx'den içe aktarma gerçekten sayfa yüklemesini yavaşlatır. istek sayısını onunla karşılaştırın v olmadan = rxjs / Rx kullanmadığınız ancak örneğin rxjs / Observable kullanın
danday74

Rxjs / Rx içe aktarımı artık sık sık tüy bırakmayacak, kara listeye alınmış bir içe aktarmadır. Geçmişte bunun iyi bir şey olarak görüldüğünü biliyorum (ve bunu yaptım), ancak günümüzde oyun oynamaktan başka hiçbir şey için asla doğru bir cevabın parçası olmamalı.
Tim Consolazio

93

RxJS 5.5+ ile catchoperatör artık kullanımdan kaldırılmıştır. Şimdi catchErroroperatörü ile birlikte kullanmalısınız pipe.

RxJS v5.5.2, Angular 5 için varsayılan bağımlılık sürümüdür.

catchErrorŞimdi "rxjs / operators" dan içe aktarmanız ve boru operatörünü kullanmanız dahil olmak üzere içe aktardığınız her RxJS Operatörü için.

Gözlemlenebilir bir Http isteği için yakalama hatası örneği

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

Burada catchile değiştirildiğine catchErrorve pipeoperatörün, nokta zincirleme ile alışkın olduğunuza benzer şekilde operatörleri oluşturmak için kullanıldığına dikkat edin.


Daha fazla bilgi için pipable (önceden izin verilebilir olarak biliniyordu ) operatörleri hakkındaki rxjs belgelerine bakın .


edilir map(res => res)gerekli?
Pieter De Bie

1
Hayır, RxJS pipe işlevi, birden çok işlevi tek bir işlevde birleştirmenize olanak tanır. Pipe () işlevi, birleştirmek istediğiniz işlevleri bağımsız değişkenleri olarak alır ve çalıştırıldığında, oluşturulan işlevleri sırayla çalıştıran yeni bir işlev döndürür. Bu haritalama teknik olarak bir kimlik işlevi olduğu için hiçbir şey yapmaz.
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');
  }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.