您好,登錄后才能下訂單哦!
本篇內容介紹了“Rxjs中處理錯誤和抓取錯誤怎么解決”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
我們的應用中使用了一個服務,用來獲取啤酒列表數據,然后將它們的第一個數據作為標題展示。
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
操作符。
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); }, }); }
有時候,我們不想在組件中傳播錯誤。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), });
“Rxjs中處理錯誤和抓取錯誤怎么解決”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。