प्रॉपर्टी 'कैच' टाइप 'ऑब्जर्वेबल <कोई>' पर मौजूद नहीं है


127

Http सेवा का उपयोग करने के लिए कोणीय 2 प्रलेखन पृष्ठ पर, एक उदाहरण है।

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

मैंने कोणीय 2-वेबपैक-स्टार्टर परियोजना का क्लोन बनाया और उपरोक्त कोड को स्वयं जोड़ा।

मैं आयातित Observableका उपयोग कर

import {Observable} from 'rxjs/Observable';

मैं मान रहा हूँ कि गुणों Observableको भी आयात किया गया है ( .mapकाम करता है)। Rxjs.beta-6 के लिए चैंज को देखा और इसके बारे में कुछ भी नहीं बताया गया है catch

जवाबों:


246

चेतावनी : यह समाधान Angular 5.5 के बाद से हटा दिया गया है, कृपया नीचे दिए गए ट्रेंट के उत्तर को देखें

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

हां, आपको ऑपरेटर आयात करने की आवश्यकता है:

import 'rxjs/add/operator/catch';

या Observableइस तरह से आयात करें:

import {Observable} from 'rxjs/Rx';

लेकिन इस मामले में, आप सभी ऑपरेटरों को आयात करते हैं।

अधिक विवरण के लिए यह प्रश्न देखें:


2
क्या आप जानते हैं कि गुणों का आयात क्यों नहीं किया जाता है import {Observable} from 'rxjs/Observable';? वह मुझे अधिक सहज लगता है।
ब्रायनआर

6
क्योंकि Rxjs को इस तरह डिजाइन किया गया है। rxjs/Observableमॉड्यूल ऑपरेटरों आयात नहीं करता है क्योंकि वहाँ ऑपरेटरों के एक बहुत हैं। rxjs/Rxमॉड्यूल आयात सब ... मुझे लगता है कि यह एक डिजाइन पसंद है।
थिएरी टेम्पलर

4
rxjs / Rx से आयात करना वास्तव में धीमा पृष्ठ लोड है। तुलना के बिना इसके साथ गणना की तुलना करें v = आधा अनुरोध जब u rxjs / Rx का उपयोग न करें, लेकिन उदाहरण के लिए उपयोग rxjs /
ऑब्जर्वेबल

Rxjs / Rx आयात अक्सर अब भी नहीं होगा, यह एक ब्लैकलिस्टेड आयात है। मुझे पता है कि अतीत में इसे ठीक (और मैंने ऐसा किया है) के रूप में देखा गया था, लेकिन आजकल इसे खेलने के अलावा किसी भी चीज के लिए सही उत्तर का हिस्सा नहीं होना चाहिए।
टिम कंसोलियाओ

93

RxJS 5.5+ के साथ, catchऑपरेटर अब पदावनत हो गया है। अब आपको catchErrorऑपरेटर के साथ संयोजन के रूप में उपयोग करना चाहिए pipe

RxJS v5.5.2 कोणीय 5 के लिए डिफ़ॉल्ट निर्भरता संस्करण है।

आपके द्वारा आयात किए जाने वाले प्रत्येक RxJS ऑपरेटर के लिए, catchErrorअब आपको 'rxjs / ऑपरेटर्स' से आयात करना चाहिए और पाइप ऑपरेटर का उपयोग करना चाहिए।

एक 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 (पहले के रूप में जाना किराए पर देने में अधिक जानकारी के लिए) ऑपरेटरों।


की map(res => res)आवश्यकता है
पीटर डी

1
नहींं, RxJS pipeफ़ंक्शन आपको एक फ़ंक्शन में कई फ़ंक्शन संयोजित करने देता है। पाइप () फ़ंक्शन अपने कार्यों के तर्क के रूप में लेता है जिन्हें आप संयोजित करना चाहते हैं, और एक नया फ़ंक्शन देता है, जिसे निष्पादित करते समय, अनुक्रमित कार्यों को क्रम से चलाता है। यह मानचित्रण कुछ भी नहीं करता है, क्योंकि यह तकनीकी रूप से एक पहचान समारोह है।
ट्रेंट

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');
  }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.