91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Rxjs中處理錯誤和抓取錯誤怎么解決

發布時間:2022-08-24 17:43:10 來源:億速云 閱讀:157 作者:iii 欄目:開發技術

本篇內容介紹了“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,通過某種策略來捕獲錯誤。

使用 try-catch

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 的操作符

Rxjs 提供了一些操作符幫助我們處理這些錯誤,每個都可以使用在這些場景中,我們來了解下。

我們將接觸 catchErrorthrowErrorEMPTY

catchError

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 很適合我們。

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

EMPTY

有時候,我們不想在組件中傳播錯誤。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中處理錯誤和抓取錯誤怎么解決”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永济市| 丰原市| 盘锦市| 横峰县| 黄梅县| 东乌珠穆沁旗| 东乡族自治县| 河北省| 连平县| 东丰县| 桂东县| 二连浩特市| 尉氏县| 宽城| 乐平市| 扶风县| 安丘市| 宿迁市| 崇仁县| 铜山县| 濮阳市| 芦山县| 天峻县| 广南县| 桐梓县| 于田县| 甘泉县| 迭部县| 大英县| 古丈县| 固镇县| 大安市| 高台县| 平果县| 莱芜市| 科技| 双桥区| 泰宁县| 阿克陶县| 长武县| 太谷县|