<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
使用 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
不去觸發元件中的錯誤。
本文是譯文,採用意譯的形式。原文地址這裡
到此這篇關於Rxjs 中怎麼處理和抓取錯誤的文章就介紹到這了,更多相關Rxjs 錯誤處理內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45