如何解决 angular 8 中 Observable 中的 catch 错误?
How to solve catch error in Observable in angular 8?
我编写了错误处理程序代码,但我在 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' 在类型 'Observable' 上不存在。
在 observable 上捕获错误的最佳方法是:
this.http.get<user[]>(this.url).pipe(
tap(),
catchError(err => { return this.errorHandler(err) }
)
如果 this.http.get()
是一个 Promise,就像您在代码 .catch(...)
中所做的那样,就可以了。尝试在管道末尾或 finalize(..)
之前使用 catchError(...)
(如果您使用它)。
在 Observables 没有 .pipe()
和你之前,像 Promises 中的链接操作,所以他们将名称 .then()
更改为我认为 flatMap()
并将 .catch()
更改为 catchError()
所以程序员知道它是 Observable 还是 Promise。
您可以在 rxjs/operators
中使用 catchError
。
尝试如下。
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.");
}
}
import { Observable, throwError } from 'rxjs';
import { catchError, } from 'rxjs/operators';
return this.http.get<user[]>(this.url).pipe(catchError(this.errorHandler))
errorHandler(error: HttpErrorResponse) {
return throwError(error.message || "server error.");
}
在最后一个版本的 rxjs 中你应该使用:
return return this.http.get<user[]>(this.url)
.subscribe((r:Author) => console.log("GOOD"),
err => console.log("ERROR))
https://rxjs.dev/deprecations/subscribe-arguments
你应该做的:
source$.subscribe({ next: doSomething, error: doSomethingElse, complete: lol }).
根据最新文档
我编写了错误处理程序代码,但我在 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' 在类型 'Observable' 上不存在。
在 observable 上捕获错误的最佳方法是:
this.http.get<user[]>(this.url).pipe(
tap(),
catchError(err => { return this.errorHandler(err) }
)
如果 this.http.get()
是一个 Promise,就像您在代码 .catch(...)
中所做的那样,就可以了。尝试在管道末尾或 finalize(..)
之前使用 catchError(...)
(如果您使用它)。
在 Observables 没有 .pipe()
和你之前,像 Promises 中的链接操作,所以他们将名称 .then()
更改为我认为 flatMap()
并将 .catch()
更改为 catchError()
所以程序员知道它是 Observable 还是 Promise。
您可以在 rxjs/operators
中使用 catchError
。
尝试如下。
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.");
}
}
import { Observable, throwError } from 'rxjs';
import { catchError, } from 'rxjs/operators';
return this.http.get<user[]>(this.url).pipe(catchError(this.errorHandler))
errorHandler(error: HttpErrorResponse) {
return throwError(error.message || "server error.");
}
在最后一个版本的 rxjs 中你应该使用:
return return this.http.get<user[]>(this.url)
.subscribe((r:Author) => console.log("GOOD"),
err => console.log("ERROR))
https://rxjs.dev/deprecations/subscribe-arguments
你应该做的:
source$.subscribe({ next: doSomething, error: doSomethingElse, complete: lol }).
根据最新文档