Как решить ошибку отлова в Observable в угловых 8? - PullRequest
3 голосов
/ 09 октября 2019

Я делаю код обработчика ошибок, но я получил ошибку в catch. неопределенный метод.

Это мой код serivce.ts.

import { Injectable } from "@angular/core";
import { HttpClient, HttpErrorResponse } from "@angular/common/http";
import { user } from "./user";
import { Observable } from "rxjs";
import "rxjs/add/operator/catch";
import "rxjs/add/Observable/throw";
@Injectable({
  providedIn: "root"
})
export class DemoService {
  private url: string = "/assets/demo/user.json";
  constructor(private http: HttpClient) {}

  getuserdetails(): Observable<user[]> {
    return this.http.get<user[]>(this.url).catch(this.errorHandler);
  }
  errorHandler(error: HttpErrorResponse) {
    return Observable.throw(error.message || "server error.");
  }
}

Это код моего файла app.component.ts

 public userdetails = [];
  public errorMsg;
  constructor(private user: DemoService) {}
  ngOnInit() {
    this.user
      .getuserdetails()
      .subscribe(
        $data => (this.userdetails = $data),
        error => (this.errorMsg = error)
      );
  } 

Я получил ошибку в catch. и сообщение об ошибке: свойство «catch» не существует для типа «Observable».

Ответы [ 2 ]

2 голосов
/ 09 октября 2019

Для этого вы можете использовать catchError в rxjs/operators. Попробуйте это следующим образом.

import { catchError } from 'rxjs/operators';

export class DemoService {

    getuserdetails(): Observable<user[]> {
        return this.http.get<user[]>(this.url)
            .pipe(catchError(this.errorHandler))
    }
    errorHandler(error: HttpErrorResponse) {
        return Observable.throw(error.message || "server error.");
    }
}
2 голосов
/ 09 октября 2019

Лучший способ отловить ошибку в наблюдаемом виде:

this.http.get<user[]>(this.url).pipe(
   tap(),
   catchError(err => { return this.errorHandler(err) }
)

Если this.http.get() - это Обещание, оставьте его, как Вы делали в своем коде .catch(...) в порядке. Попробуйте использовать catchError(...) в конце канала или перед finalize(..), если вы его используете.

До того, как у Observables не было .pipe(), и вы, где цепочечные операции, как в Promises, поэтому они меняют имя .then() ная думаю flatMap() и .catch() до catchError() Так что программист знает, это Наблюдаемый или Обещание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...