最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Rxjs?中處理錯(cuò)誤和抓取錯(cuò)誤的代碼案例

 更新時(shí)間:2022年08月20日 11:19:25   作者:Jimmy  
這篇文章主要介紹了Rxjs?中怎么處理和抓取錯(cuò)誤,本文,我們學(xué)習(xí)了如何使用?catchError?在數(shù)據(jù)流中抓取錯(cuò)誤,怎么去修改和返回?observable,或者使用?EMPTY?不去觸發(fā)組件中的錯(cuò)誤,需要的朋友可以參考下

使用 Rxjs,對(duì)于初學(xué)者來(lái)說(shuō),當(dāng)我們處理 observables 錯(cuò)誤的時(shí)候容易疑惑,因?yàn)槲覀儠?huì)考慮使用 try-catch 方式捕獲。但是,Rxjs 是通過(guò)操作符來(lái)管理錯(cuò)誤。

我們通過(guò)代碼案例一步步來(lái)了解。案例是使用 angular httpClient 模塊來(lái)講解,當(dāng)然這適用于任何數(shù)據(jù)流。

場(chǎng)景

我們的應(yīng)用中使用了一個(gè)服務(wù),用來(lái)獲取啤酒列表數(shù)據(jù),然后將它們的第一個(gè)數(shù)據(jù)作為標(biāo)題展示。

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);
  }
}

應(yīng)用的組件訂閱了它,展示啤酒列表,然后獲取其第一條數(shù)據(jù)。

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 錯(cuò)誤了會(huì)發(fā)生什么呢?我們將該 URL 改成一個(gè)錯(cuò)誤的 URL,通過(guò)某種策略來(lái)捕獲錯(cuò)誤。

使用 try-catch

Javascript 中,我們使用 try-catch 來(lái)驗(yàn)證代碼片段,如果某些片段出錯(cuò)了,我們就會(huì)捕獲到它。

但是,在 rxjs 中,try-catch 沒(méi)用效果。因?yàn)殄e(cuò)誤是發(fā)生在訂閱范圍(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';
    }
  }
}

訂閱中誰(shuí)抓取錯(cuò)誤

理解 try-catch 為什么不起作用,記住,當(dāng)我們訂閱第一個(gè) observable 的時(shí)候,訂閱會(huì)調(diào)起三個(gè)可選的參數(shù)。

      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:數(shù)據(jù)流被成功捕獲調(diào)用
  • error:發(fā)送一個(gè) Javascript 錯(cuò)誤或者異常
  • complete當(dāng)數(shù)據(jù)流完成時(shí)候調(diào)用

所以,錯(cuò)誤是發(fā)生在訂閱函數(shù)的區(qū)域,所以我們?cè)趺闯隽四兀?/p>

使用 Rxjs 的操作符

Rxjs 提供了一些操作符幫助我們處理這些錯(cuò)誤,每個(gè)都可以使用在這些場(chǎng)景中,我們來(lái)了解下。

我們將接觸 catchErrorthrowErrorEMPTY。

catchError

catchError 抓取錯(cuò)誤,但是會(huì)發(fā)出值。簡(jiǎn)而言之,它在錯(cuò)誤的基礎(chǔ)上返回另一個(gè) observable

我移除上面提到的三個(gè)回調(diào)函數(shù)的策略,然后配合管道來(lái)使用 catchError 操作符。

更多相關(guān) pipe

this.beerService
      .getBeers()
      .pipe(catchError(() => of([{ name: 'my default beer' }])))
      .subscribe((beers) => {
        console.log(beers);
        this.beers = beers;
        this.title = beers[0].name;
      });

如果我們的代碼中錯(cuò)誤時(shí)候需要調(diào)用其他內(nèi)容,catchError 非常適合發(fā)出默認(rèn)值,并且訂閱可以將默認(rèn)值拋出去。

throwError

有時(shí)候,我們不想拋出錯(cuò)誤,但是想要提示錯(cuò)誤信息。針對(duì)這個(gè)場(chǎng)景,throwError 很適合我們。

throwError 不會(huì)觸發(fā)數(shù)據(jù)到 next 函數(shù),這使用訂閱者回調(diào)的錯(cuò)誤。我們我們想捕獲自定義的錯(cuò)誤或者后端提示的錯(cuò)誤,我們可以使用訂閱者中的 error 回調(diào)函數(shù)。

 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);
        },
      });
  }

更多相關(guān) throwError

EMPTY

有時(shí)候,我們不想在組件中傳播錯(cuò)誤。Rxjs 提供了 EMPTY 常量并返回一個(gè)空的 Observable,并未拋出任何的數(shù)據(jù)到訂閱著回調(diào)中。

this.beerService
      .getBeers()
      .pipe(
        catchError(() => {
          return EMPTY;
        })
      )
      .subscribe({
        next: (beers) => {
          this.beers = beers;
          this.title = beers[0].name;
        },
        error: (err) => console.log(err),
      });

更多相關(guān) EMPTY

總結(jié)

本文,我們學(xué)習(xí)了如何使用 catchError 在數(shù)據(jù)流中抓取錯(cuò)誤,怎么去修改和返回 observable,或者使用 EMPTY 不去觸發(fā)組件中的錯(cuò)誤。

本文是譯文,采用意譯的形式。原文地址這里

到此這篇關(guān)于Rxjs 中怎么處理和抓取錯(cuò)誤的文章就介紹到這了,更多相關(guān)Rxjs 錯(cuò)誤處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 執(zhí)行iframe中的javascript方法

    執(zhí)行iframe中的javascript方法

    如何調(diào)用執(zhí)行iframe中的方法?如下
    2008-10-10
  • 微信小程序 點(diǎn)擊切換樣式scroll-view實(shí)現(xiàn)代碼實(shí)例

    微信小程序 點(diǎn)擊切換樣式scroll-view實(shí)現(xiàn)代碼實(shí)例

    這篇文章主要介紹了微信小程序 點(diǎn)擊切換樣式scroll-view實(shí)現(xiàn)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Javascript仿PHP $_GET獲取URL中的參數(shù)

    Javascript仿PHP $_GET獲取URL中的參數(shù)

    這篇文章主要介紹了Javascript仿PHP $_GET獲取URL中的參數(shù)代碼實(shí)例,需要的朋友可以參考下
    2014-05-05
  • JavaScript中常見(jiàn)內(nèi)置函數(shù)用法示例

    JavaScript中常見(jiàn)內(nèi)置函數(shù)用法示例

    這篇文章主要介紹了JavaScript中常見(jiàn)內(nèi)置函數(shù)用法,結(jié)合實(shí)例形式分析了JavaScript常用內(nèi)置函數(shù)的功能、參數(shù)、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2018-05-05
  • JS字符串按逗號(hào)和回車(chē)分隔的方法

    JS字符串按逗號(hào)和回車(chē)分隔的方法

    下面小編就為大家?guī)?lái)一篇JS字符串按逗號(hào)和回車(chē)分隔的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • JS對(duì)象復(fù)制(深拷貝和淺拷貝)

    JS對(duì)象復(fù)制(深拷貝和淺拷貝)

    這篇文章主要介紹了JS對(duì)象復(fù)制(深拷貝和淺拷貝),并附有詳細(xì)代碼,感興趣的小伙伴們,可以參考下
    2021-04-04
  • 圖解js圖片輪播效果

    圖解js圖片輪播效果

    這篇文章主要以圖片展示的方式向大家講解了js圖片輪播效果的實(shí)現(xiàn)方法,對(duì)圖片輪播實(shí)現(xiàn)原理進(jìn)行了詳細(xì)介紹,感興趣的朋友可以參考一下
    2015-12-12
  • layui框架中l(wèi)ayer父子頁(yè)面交互的方法分析

    layui框架中l(wèi)ayer父子頁(yè)面交互的方法分析

    這篇文章主要介紹了layui框架中l(wèi)ayer父子頁(yè)面交互的方法,結(jié)合實(shí)例形式分析了layer父子頁(yè)面交互的常用技巧以及l(fā)ayer彈出多個(gè)iframe找到父頁(yè)面的操作方法,需要的朋友可以參考下
    2017-11-11
  • JavaScript中l(wèi)et與const命令使用

    JavaScript中l(wèi)et與const命令使用

    本文主要介紹了JavaScript中l(wèi)et與const命令使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 無(wú)刷新上傳文件并返回自定義值

    無(wú)刷新上傳文件并返回自定義值

    本文給大家簡(jiǎn)單分享了一下個(gè)人項(xiàng)目中解決無(wú)刷新上傳文件的方法和示例,有需要的小伙伴可以參考下。
    2015-06-06

最新評(píng)論

临清市| 家居| 彰化市| 石景山区| 阳春市| 赞皇县| 弥勒县| 河池市| 高碑店市| 山阳县| 谷城县| 吉首市| 灵山县| 临高县| 犍为县| 杭锦后旗| 松阳县| 宜章县| 桃园市| 枞阳县| 南岸区| 丰镇市| 博野县| 徐水县| 遵义县| 晴隆县| 海原县| 响水县| 白河县| 内江市| 新郑市| 尖扎县| 财经| 静乐县| 达州市| 望奎县| 宜宾市| 昔阳县| 中阳县| 宝鸡市| 揭西县|