Rxjs中处理和抓取错误是怎样的?
Admin 2022-11-28 群英技术资讯 1305 次浏览
本篇内容介绍了“Rxjs中处理和抓取错误是怎样的?”的有关知识,在实际项目的操作过程或是学习过程中,不少人都会遇到这样的问题,接下来就让小编带大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Rxjs,对于初学者来说,当我们处理 observables 错误的时候容易疑惑,因为我们会考虑使用 try-catch 方式捕获。但是,Rxjs 是通过操作符来管理错误。我们通过代码案例一步步来了解。案例是使用 angular httpClient 模块来讲解,当然这适用于任何数据流。
我们的应用中使用了一个服务,用来获取啤酒列表数据,然后将它们的第一个数据作为标题展示。
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
@Injectable()
export class BeerService {
private apiUrl = 'https://api.punkapi.com/v2/beers';
constructor(private http: HttpClient) {}
getBeers(): Observable<any> {
return this.http.get(this.apiUrl);
}
}
应用的组件订阅了它,展示啤酒列表,然后获取其第一条数据。
import { Component, OnInit } from '@angular/core';
import { BeerService } from './beer.service';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent implements OnInit {
title = 'my first beer';
beers = [];
constructor(private beerService: BeerService) {}
ngOnInit() {
try {
this.beerService.getBeers().subscribe((beers) => {
console.log(beers);
this.beers = beers;
this.title = beers[0].name;
});
} catch (err) {
this.title = 'Ups a error';
}
}
}
如果 API 错误了会发生什么呢?我们将该 URL 改成一个错误的 URL,通过某种策略来捕获错误。
在 Javascript 中,我们使用 try-catch 来验证代码片段,如果某些片段出错了,我们就会捕获到它。
但是,在 rxjs 中,try-catch 没用效果。因为错误是发生在订阅范围(subscribe scope),所以 try-catch 解决不了什么,我们需要使用 Rxjs 操作符。
export class AppComponent implements OnInit {
title = 'my first beer';
beers = [];
constructor(private beerService: BeerService) {}
ngOnInit() {
try {
this.beerService.getBeers().subscribe((beers) => {
console.log(beers);
this.beers = beers;
this.title = beers[0].name;
});
} catch (err) {
this.title = 'Us a error';
}
}
}
理解 try-catch 为什么不起作用,记住,当我们订阅第一个 observable 的时候,订阅会调起三个可选的参数。
this.beerService
.getBeers()
.subscribe({
next: (beers) => {
console.log(beers);
this.beers = beers;
this.title = beers[0].name;
},
error: (e) => {
console.log(e);
this.title = 'ups';
},
complete: () => console.log('done'),
});
next:数据流被成功捕获调用error:发送一个 Javascript 错误或者异常complete当数据流完成时候调用所以,错误是发生在订阅函数的区域,所以我们怎么出了呢?
Rxjs 提供了一些操作符帮助我们处理这些错误,每个都可以使用在这些场景中,我们来了解下。
我们将接触 catchError,throwError 和 EMPTY。
catchError 抓取错误,但是会发出值。简而言之,它在错误的基础上返回另一个 observable。
我移除上面提到的三个回调函数的策略,然后配合管道来使用 catchError 操作符。
更多相关 pipe
this.beerService
.getBeers()
.pipe(catchError(() => of([{ name: 'my default beer' }])))
.subscribe((beers) => {
console.log(beers);
this.beers = beers;
this.title = beers[0].name;
});
如果我们的代码中错误时候需要调用其他内容,
catchError非常适合发出默认值,并且订阅可以将默认值抛出去。
有时候,我们不想抛出错误,但是想要提示错误信息。针对这个场景,throwError 很适合我们。
throwError 不会触发数据到 next 函数,这使用订阅者回调的错误。我们我们想捕获自定义的错误或者后端提示的错误,我们可以使用订阅者中的 error 回调函数。
ngOnInit() {
this.beerService
.getBeers()
.pipe(
catchError(() => {
return throwError(() => new Error('ups sommething happend'));
})
)
.subscribe({
next: (beers) => {
console.log(beers);
this.beers = beers;
this.title = beers[0].name;
},
error: (err) => {
console.log(err);
},
});
}
更多相关throwError
有时候,我们不想在组件中传播错误。Rxjs 提供了 EMPTY 常量并返回一个空的 Observable,并未抛出任何的数据到订阅着回调中。
this.beerService
.getBeers()
.pipe(
catchError(() => {
return EMPTY;
})
)
.subscribe({
next: (beers) => {
this.beers = beers;
this.title = beers[0].name;
},
error: (err) => console.log(err),
});
更多相关EMPTY
本文,我们学习了如何使用 catchError 在数据流中抓取错误,怎么去修改和返回 observable,或者使用 EMPTY 不去触发组件中的错误。
本文是译文,采用意译的形式。原文地址这里
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了React+umi+typeScript创建项目的过程,结合代码介绍了项目框架搭建的方式,本文给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
async 是“异步”的简写,async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执行完成,await 只能出现在 async 函数中。
这篇文章主要为大家介绍了requestAnimationFrame定时动画屏幕刷新率节流示例浅析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
这篇文章主要为大家详细介绍了JavaScript canvas实现雨滴特效,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
mac安装node.js的方法:1、访问nodejs官网;2、下载对应的“.pkg”文件;3、双击“.pkg”文件并按照默认步骤安装即可。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008