亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
關(guān)鍵要點(diǎn)
反應(yīng)式編程
與數(shù)組的關(guān)系
熟悉 RxJS
簡(jiǎn)單流操作
1. 使用 map() 轉(zhuǎn)換數(shù)據(jù)
2. 過濾結(jié)果
3. 使用 reduce() 收集結(jié)果
4. 使用 take() 限制結(jié)果
高階流操作
5. 使用 flatMap() 壓平流
來自 promise 的可觀察對(duì)象
6. 使用 flatMap()
組合多個(gè)流
7. 使用 concat() 和 merge() 組合流
8. 使用 switch()
9. 協(xié)調(diào)流
使用 combineLatest() 響應(yīng)任一流的更改
使用 zip 只響應(yīng)兩個(gè)流的更改
10. takeUntil
總結(jié)
關(guān)于 RxJS 函數(shù)的常見問題解答 (FAQ)
RxJS 與傳統(tǒng) JavaScript 的主要區(qū)別是什么?
如何在 RxJS 中創(chuàng)建可觀察對(duì)象?
RxJS 中的主要運(yùn)算符是什么以及它們?nèi)绾喂ぷ鳎?/a>
如何在 RxJS 中處理錯(cuò)誤?
如何取消 RxJS 中可觀察對(duì)象的訂閱?
RxJS 中熱可觀察對(duì)象和冷可觀察對(duì)象的區(qū)別是什么?
如何在 RxJS 中組合多個(gè)可觀察對(duì)象?
RxJS 中主題的目的是什么?
如何將 RxJS 與 Angular 一起使用?
RxJS 的一些常見用例是什么?
首頁 web前端 js教程 10需要知道的RXJS功能與示例

10需要知道的RXJS功能與示例

Feb 17, 2025 am 10:08 AM

10 Need-to-Know RxJS Functions with Examples

本文由 Florian Rappl 和 Moritz Kr?ger 共同評(píng)審。感謝所有 SitePoint 的同行評(píng)審員,使 SitePoint 的內(nèi)容盡善盡美!

隨著對(duì)函數(shù)式反應(yīng)式編程 (FRP) 興趣的增長(zhǎng),RxJS 已成為此范例中最流行的 JavaScript 庫之一。在本文中,我們將探討我認(rèn)為 RxJS 中十大必知函數(shù)。

注意:本文假定您熟悉 RxJS 的基礎(chǔ)知識(shí),如文章《使用 RxJS 入門函數(shù)式反應(yīng)式編程》中所述。

關(guān)鍵要點(diǎn)

  • RxJS 利用類似于隨時(shí)間推移填充的數(shù)組的可觀察對(duì)象來促進(jìn)函數(shù)式反應(yīng)式編程 (FRP),從而允許在應(yīng)用程序中進(jìn)行更聲明式和強(qiáng)大的錯(cuò)誤處理。
  • RxJS 中簡(jiǎn)單流的核心操作,例如 map()、filter()、reduce()take(),鏡像數(shù)組操作,但應(yīng)用于隨時(shí)間發(fā)出值的數(shù)流。
  • flatMap()switch() 這樣的專用函數(shù)對(duì)于分別處理復(fù)雜數(shù)據(jù)結(jié)構(gòu)和管理多個(gè)流至關(guān)重要,這使得它們對(duì)于高級(jí)反應(yīng)式編程任務(wù)至關(guān)重要。
  • 可以使用 concat()、merge()combineLatest() 等運(yùn)算符有效地組合多個(gè)流,每個(gè)運(yùn)算符在流管理和數(shù)據(jù)同步中發(fā)揮不同的作用。
  • takeUntil() 函數(shù)提供了一種基于外部條件取消訂閱的機(jī)制,這說明了 RxJS 在流控制和資源管理方面的靈活性。

反應(yīng)式編程

反應(yīng)式編程是一種編程范例,它將稱為可觀察對(duì)象的數(shù)據(jù)流作為其基本的編程單元。

流——或 RxJS 行話中的可觀察對(duì)象——類似于事件監(jiān)聽器:兩者都等待某些事情發(fā)生,并在發(fā)生時(shí)通知您。從 onClick 監(jiān)聽器獲得的一系列異步通知是數(shù)據(jù)流的完美示例。

換句話說,可觀察對(duì)象只不過是一個(gè)隨時(shí)間推移填充的數(shù)組。

該數(shù)組的元素可以來自幾乎任何地方:文件系統(tǒng)、DOM 事件、API 調(diào)用,甚至轉(zhuǎn)換后的同步數(shù)據(jù),如數(shù)組。從根本上說,反應(yīng)式編程只不過是用可觀察對(duì)象作為程序的構(gòu)建塊。

與數(shù)組的關(guān)系

數(shù)組很簡(jiǎn)單,因?yàn)樗鼈兊膬?nèi)容是最終的,除非明確更改。從這個(gè)意義上說,數(shù)組中沒有什么本質(zhì)上的時(shí)間性。

另一方面,可觀察對(duì)象由時(shí)間定義。您最多只能知道流到目前為止已接收 [1, 2, 3]。您不能確定您是否會(huì)得到 4——或者不會(huì)——并且是數(shù)據(jù)源,而不是您的程序,決定了這一點(diǎn)。

流和數(shù)組之間的關(guān)系是如此深刻,以至于大多數(shù)反應(yīng)式擴(kuò)展都源于函數(shù)式編程的世界,其中列表操作是核心。

熟悉 RxJS

考慮一下常見的待辦事項(xiàng)應(yīng)用程序。讓我們看看使用 RxJS 如何顯示用戶未完成任務(wù)的名稱的問題:

const task_stream =
  // 創(chuàng)建所有數(shù)據(jù)庫中任務(wù)的流
  getTasks().
    // 只獲取此用戶的任務(wù)
    filter((task) => task.user_id == user_id).
    // 獲取未完成的任務(wù)
    filter((task) => !task.completed).
    // 只獲取任務(wù)名稱
    map((task) => task.name)

/* 任務(wù)如下所示:
   task = {
    user_id   : number,
    completed : boolean,
    name      : string
   }
 */

到目前為止,這只不過是數(shù)組擴(kuò)展,但它演示了反應(yīng)式編程的函數(shù)式風(fēng)格。

通過添加更復(fù)雜、“現(xiàn)實(shí)世界”的功能,其聲明性性質(zhì)變得清晰。假設(shè)我們想要:

  • 響應(yīng)用戶選擇查看已完成或未完成的任務(wù)來啟動(dòng)請(qǐng)求;
  • 每秒只發(fā)送對(duì)上次選擇的請(qǐng)求一次,以免在用戶快速更改選擇時(shí)浪費(fèi)帶寬;
  • 最多重試三次失敗的請(qǐng)求;以及
  • 只有當(dāng)服務(wù)器發(fā)送與上次不同的響應(yīng)時(shí)才重繪視圖。
const task_stream =
  parameter_stream.
    debounce(1000).
    map((parameter) => {
      getTasks().
        retry(3).
        filter((task) => task.user_id === user_id).
        filter((task) => task.completed === parameter).
        map((task)    => task.name)
    }).
    flatMap(Rx.Observable.from).
    distinctUntilChanged().
    update()

逐步分解:

  • parameter_stream 告訴我們用戶是否想要已完成或未完成的任務(wù),并將選擇存儲(chǔ)在 parameter 中;
  • debounce() 確保我們每秒鐘只關(guān)注最后一次按鈕點(diǎn)擊;
  • getTasks() 周圍的部分與之前相同;
  • distinctUntilChanged() 確保我們只在服務(wù)器的響應(yīng)與上次不同時(shí)才關(guān)注;以及
  • update() 負(fù)責(zé)更新 UI 以反映我們從服務(wù)器獲得的內(nèi)容。

在命令式、基于回調(diào)的樣式中處理 debounce、retry 和“distinct until changed”邏輯是有效的,但它既脆弱又復(fù)雜。

關(guān)鍵在于,使用 RxJS 進(jìn)行編程允許:

  1. 聲明式程序;
  2. 可擴(kuò)展的系統(tǒng);以及
  3. 簡(jiǎn)單直接、強(qiáng)大的錯(cuò)誤處理。

在瀏覽 RxJS 十大必知函數(shù)的過程中,我們將遇到上述示例中的每個(gè)函數(shù)。

簡(jiǎn)單流操作

簡(jiǎn)單流(發(fā)出簡(jiǎn)單值,如字符串的流)的基本函數(shù)包括:

  • map()
  • filter()
  • reduce()
  • take() / takeWhile()

除了 take() 和 takeWhile() 之外,這些都類似于 JavaScript 的高階數(shù)組函數(shù)。

我們將通過解決一個(gè)示例問題來應(yīng)用這些函數(shù):查找數(shù)據(jù)庫中所有具有 .com 或 .org 網(wǎng)站的用戶,并計(jì)算其網(wǎng)站名稱的平均長(zhǎng)度。

JSONPlaceholder 將作為我們的用戶來源。這是我們將使用的用戶數(shù)據(jù)的 JSON 表示。

1. 使用 map() 轉(zhuǎn)換數(shù)據(jù)

在可觀察對(duì)象上使用 map() 與在數(shù)組上使用它相同。它:

  1. 接受回調(diào)作為參數(shù);
  2. 在您調(diào)用的數(shù)組的每個(gè)元素上執(zhí)行它;以及
  3. 返回一個(gè)新數(shù)組,其中原始數(shù)組的每個(gè)元素都被調(diào)用回調(diào)在其上產(chǎn)生的結(jié)果所替換。

在可觀察對(duì)象上使用 map() 時(shí),唯一的區(qū)別是:

  1. 它返回一個(gè)新的可觀察對(duì)象,而不是一個(gè)新的數(shù)組;以及
  2. 它在可觀察對(duì)象發(fā)出新項(xiàng)目時(shí)執(zhí)行,而不是立即全部執(zhí)行一次。

我們可以使用 map() 將我們的用戶數(shù)據(jù)流轉(zhuǎn)換為僅包含其網(wǎng)站名稱的列表:

const task_stream =
  // 創(chuàng)建所有數(shù)據(jù)庫中任務(wù)的流
  getTasks().
    // 只獲取此用戶的任務(wù)
    filter((task) => task.user_id == user_id).
    // 獲取未完成的任務(wù)
    filter((task) => !task.completed).
    // 只獲取任務(wù)名稱
    map((task) => task.name)

/* 任務(wù)如下所示:
   task = {
    user_id   : number,
    completed : boolean,
    name      : string
   }
 */

在這里,我們使用 map 將傳入流中的每個(gè)用戶對(duì)象替換為每個(gè)用戶的網(wǎng)站。

RxJS 還允許您調(diào)用 map() as select()。這兩個(gè)名稱都指代相同的函數(shù)。

2. 過濾結(jié)果

像 map() 一樣,filter() 在可觀察對(duì)象上的作用與在數(shù)組上的作用大致相同。要查找每個(gè)具有 .net 或 .org 網(wǎng)站地址的用戶,我們可以這樣寫:

const task_stream =
  parameter_stream.
    debounce(1000).
    map((parameter) => {
      getTasks().
        retry(3).
        filter((task) => task.user_id === user_id).
        filter((task) => task.completed === parameter).
        map((task)    => task.name)
    }).
    flatMap(Rx.Observable.from).
    distinctUntilChanged().
    update()

這將只選擇其網(wǎng)站以“net”或“org”結(jié)尾的用戶。

filter() 也有別名 where()。

3. 使用 reduce() 收集結(jié)果

reduce() 允許我們使用所有單個(gè)值并將它們轉(zhuǎn)換為單個(gè)結(jié)果。

reduce() 往往是最令人困惑的基本列表操作,因?yàn)榕c filter() 或 map() 不同,它的行為因使用而異。

通常,reduce() 獲取值的集合,并將其轉(zhuǎn)換為單個(gè)數(shù)據(jù)點(diǎn)。在我們的例子中,我們將向它提供一個(gè)網(wǎng)站名稱流,并使用 reduce() 將該流轉(zhuǎn)換為一個(gè)對(duì)象,該對(duì)象計(jì)算我們找到的網(wǎng)站數(shù)量以及其名稱長(zhǎng)度的總和。

source.
  map((user) => user.website)

在這里,我們將流簡(jiǎn)化為單個(gè)對(duì)象,它跟蹤:

  1. 我們已經(jīng)看到了多少個(gè)站點(diǎn);以及
  2. 所有名稱的總長(zhǎng)度。

請(qǐng)記住,reduce() 只有在源可觀察對(duì)象完成時(shí)才返回結(jié)果。如果您想在每次流接收新項(xiàng)目時(shí)都知道累加器的狀態(tài),請(qǐng)改用 scan()。

4. 使用 take() 限制結(jié)果

take() 和 takeWhile() 補(bǔ)充了簡(jiǎn)單流的基本函數(shù)。

take(n) 從流中讀取 n 個(gè)值,然后取消訂閱。

我們可以使用 scan() 在每次我們收到網(wǎng)站時(shí)發(fā)出我們的對(duì)象,并且只 take() 前兩個(gè)值。

source.
  map((user) => user.website).
  filter((website) => (website.endsWith('net') || website.endsWith('org'));
})

RxJS 還提供 takeWhile(),它允許您在某個(gè)布爾測(cè)試成立之前獲取值。我們可以這樣使用 takeWhile() 來編寫上述流:

source.
  map((user) => user.website).
  filter((website) => (website.endsWith('net') || website.endsWith('org'))).
  reduce((data, website) => {
    return {
      count       : data.count += 1,
      name_length : data.name_length += website.length
    }
  }, { count : 0, name_length : 0 })

高階流操作

除了它們?cè)诳捎^察對(duì)象而不是數(shù)組上工作之外,這些函數(shù)幾乎與熟悉的列表操作相同。

“[I]f you know how to program against Arrays using the Array#extras, then you already know how to use RxJS!” ~ RxJS 文檔

正如數(shù)組可以包含比簡(jiǎn)單值(如數(shù)組或?qū)ο螅└鼜?fù)雜的數(shù)據(jù)一樣,可觀察對(duì)象也可以發(fā)出高階數(shù)據(jù),如 Promise 或其他可觀察對(duì)象。這就是更專業(yè)的工具發(fā)揮作用的地方。

5. 使用 flatMap() 壓平流

……事實(shí)上,我們已經(jīng)在使用了!

當(dāng)我們定義源流時(shí),我們調(diào)用了 fromPromise() 和 flatMap():

source.
  map((user) => user.website).
  filter((website) => (website.endsWith('net') || website.endsWith('org'))).
  scan((data, website) => {
      return {
        count       : data.count += 1,
        name_length : data.name_length += website.length
      }
    }, { count : 0, name_length : 0 }).
  take(2);

這使用了三個(gè)新的機(jī)制:

  1. fromPromise;
  2. Rx.Observable.from;以及
  3. flatMap。

來自 promise 的可觀察對(duì)象

Promise 代表我們將異步獲得的單個(gè)未來值——例如,對(duì)服務(wù)器的調(diào)用的結(jié)果。

Promise 的一個(gè)定義特征是它只代表一個(gè)未來的值。它不能返回多個(gè)異步數(shù)據(jù);這是可觀察對(duì)象所做的,也是兩者之間的一個(gè)根本區(qū)別。

這意味著,當(dāng)我們使用 Rx.Observable.fromPromise() 時(shí),我們得到一個(gè)可觀察對(duì)象,它發(fā)出單個(gè)值——或者:

  1. Promise 解析到的值;或
  2. Promise 拒絕的值。

當(dāng) Promise 返回字符串或數(shù)字時(shí),我們不需要做任何特殊的事情。但是,當(dāng)它返回?cái)?shù)組時(shí)(在我們的例子中就是這樣),我們更希望創(chuàng)建一個(gè)可觀察對(duì)象,該對(duì)象發(fā)出數(shù)組的內(nèi)容,而不是數(shù)組本身作為單個(gè)值。

6. 使用 flatMap()

此過程稱為扁平化,flatMap() 會(huì)處理它。它有很多重載,但我們只使用最簡(jiǎn)單和最常用的重載。

使用 flatMap() 時(shí),我們:

  1. 在發(fā)出 Promise 的單值解析或拒絕的可觀察對(duì)象上調(diào)用 flatMap();以及
  2. 傳遞一個(gè)函數(shù)來創(chuàng)建一個(gè)新的可觀察對(duì)象。

在我們的例子中,我們傳遞 Rx.Observable.from(),它從數(shù)組的值創(chuàng)建一個(gè)序列:

const task_stream =
  // 創(chuàng)建所有數(shù)據(jù)庫中任務(wù)的流
  getTasks().
    // 只獲取此用戶的任務(wù)
    filter((task) => task.user_id == user_id).
    // 獲取未完成的任務(wù)
    filter((task) => !task.completed).
    // 只獲取任務(wù)名稱
    map((task) => task.name)

/* 任務(wù)如下所示:
   task = {
    user_id   : number,
    completed : boolean,
    name      : string
   }
 */

這涵蓋了我們簡(jiǎn)短序言中的代碼:

const task_stream =
  parameter_stream.
    debounce(1000).
    map((parameter) => {
      getTasks().
        retry(3).
        filter((task) => task.user_id === user_id).
        filter((task) => task.completed === parameter).
        map((task)    => task.name)
    }).
    flatMap(Rx.Observable.from).
    distinctUntilChanged().
    update()

RxJS 也為 flatMap() 提供了一個(gè)別名:selectMany()。

組合多個(gè)流

通常,我們將有多個(gè)需要組合的流。組合流的方法有很多,但有一些比其他的出現(xiàn)頻率更高。

7. 使用 concat() 和 merge() 組合流

連接和合并是組合流的兩種最常見方法。

連接通過發(fā)出第一個(gè)流的值直到它完成,然后發(fā)出第二個(gè)流的值來創(chuàng)建一個(gè)新流。

合并通過發(fā)出任何活動(dòng)流的值來從多個(gè)流創(chuàng)建新流

想想在 Facebook Messenger 上同時(shí)與兩個(gè)人交談。concat() 是您從雙方收到消息,但在回復(fù)另一個(gè)人之前完成與一個(gè)人的對(duì)話的情況。merge() 就像創(chuàng)建一個(gè)群聊并同時(shí)接收兩條消息流。

source.
  map((user) => user.website)

concat() 流將首先打印 source1 的所有值,并且只有在 source1 完成后才開始打印 source2 的值。

merge() 流將根據(jù)接收到的順序打印 source1 和 source2 的值:它不會(huì)等待第一個(gè)流完成,然后再發(fā)出第二個(gè)流的值。

8. 使用 switch()

通常,我們想監(jiān)聽發(fā)出可觀察對(duì)象的可觀察對(duì)象,但只關(guān)注來自源的最新發(fā)射。

為了進(jìn)一步擴(kuò)展 Facebook Messenger 的類比,switch() 是您……好吧,根據(jù)當(dāng)前正在發(fā)送消息的人來切換您回復(fù)的人。

為此,RxJS 提供了 switch。

用戶界面為 switch() 提供了幾個(gè)很好的用例。如果我們的應(yīng)用程序每次用戶選擇他們想要搜索的內(nèi)容時(shí)都會(huì)發(fā)出請(qǐng)求,我們可以假設(shè)他們只想查看最新選擇的結(jié)果。因此,我們使用 switch() 只監(jiān)聽最新選擇的結(jié)果。

順便說一下,我們應(yīng)該確保不要浪費(fèi)帶寬,而只針對(duì)用戶每秒進(jìn)行的最后一次選擇訪問服務(wù)器。我們?yōu)榇耸褂玫暮瘮?shù)稱為 debounce()

如果您想朝另一個(gè)方向前進(jìn),并且只遵守第一次選擇,則可以使用 throttle()。它具有相同的 API,但行為相反。

9. 協(xié)調(diào)流

如果我們想允許用戶搜索具有特定 ID 的帖子或用戶怎么辦?

為了演示,我們將創(chuàng)建另一個(gè)下拉菜單,并允許用戶選擇他們想要檢索的項(xiàng)目的 ID。

有兩種情況。當(dāng)用戶:

  1. 更改任一選擇;或
  2. 更改兩個(gè)選擇。

使用 combineLatest() 響應(yīng)任一流的更改

在第一種情況下,我們需要?jiǎng)?chuàng)建一個(gè)流,該流使用以下內(nèi)容啟動(dòng)網(wǎng)絡(luò)請(qǐng)求:

  1. 用戶最近選擇的端點(diǎn);以及
  2. 用戶最近選擇的 ID。

……并在用戶更新任一選擇時(shí)執(zhí)行此操作。

這就是 combineLatest() 的用途:

const task_stream =
  // 創(chuàng)建所有數(shù)據(jù)庫中任務(wù)的流
  getTasks().
    // 只獲取此用戶的任務(wù)
    filter((task) => task.user_id == user_id).
    // 獲取未完成的任務(wù)
    filter((task) => !task.completed).
    // 只獲取任務(wù)名稱
    map((task) => task.name)

/* 任務(wù)如下所示:
   task = {
    user_id   : number,
    completed : boolean,
    name      : string
   }
 */

每當(dāng)任一流發(fā)出值時(shí),combineLatest() 都會(huì)獲取發(fā)出的值并將其與其他流發(fā)出的最后一個(gè)項(xiàng)目配對(duì),并將該對(duì)以數(shù)組的形式發(fā)出。

這在圖表中更容易可視化:

const task_stream =
  parameter_stream.
    debounce(1000).
    map((parameter) => {
      getTasks().
        retry(3).
        filter((task) => task.user_id === user_id).
        filter((task) => task.completed === parameter).
        map((task)    => task.name)
    }).
    flatMap(Rx.Observable.from).
    distinctUntilChanged().
    update()

使用 zip 只響應(yīng)兩個(gè)流的更改

要等到用戶更新其對(duì) id 和端點(diǎn)字段的選擇后,請(qǐng)將 combineLatest() 替換為 zip()。

同樣,這在圖表中更容易理解:

source.
  map((user) => user.website)

與 combineLatest() 不同,zip() 會(huì)等到兩個(gè)可觀察對(duì)象都發(fā)出新內(nèi)容后才會(huì)發(fā)出其更新值的數(shù)組。

10. takeUntil

最后,takeUntil() 允許我們監(jiān)聽第一個(gè)流,直到第二個(gè)流開始發(fā)出值。

source.
  map((user) => user.website).
  filter((website) => (website.endsWith('net') || website.endsWith('org'));
})

當(dāng)您需要協(xié)調(diào)流但不需要組合它們時(shí),這很有用。

總結(jié)

僅僅向數(shù)組添加時(shí)間維度就開啟了對(duì)程序進(jìn)行全新思考的大門。

RxJS 的內(nèi)容遠(yuǎn)不止我們?cè)谶@里看到的這些,但這已經(jīng)足夠走得很遠(yuǎn)了。

從 RxJS Lite 開始,隨時(shí)準(zhǔn)備參考文檔,并抽出時(shí)間動(dòng)手實(shí)踐。在您不知不覺中,一切都會(huì)看起來像一個(gè)流……因?yàn)橐磺卸际恰?/p>

關(guān)于 RxJS 函數(shù)的常見問題解答 (FAQ)

RxJS 與傳統(tǒng) JavaScript 的主要區(qū)別是什么?

RxJS 是一個(gè)使用可觀察對(duì)象的反應(yīng)式編程庫,用于簡(jiǎn)化異步或基于回調(diào)的代碼的組合。這與使用更命令式編程風(fēng)格的傳統(tǒng) JavaScript 相比。關(guān)鍵區(qū)別在于它們?nèi)绾翁幚頂?shù)據(jù)——RxJS 將數(shù)據(jù)視為流,可以使用各種運(yùn)算符對(duì)其進(jìn)行操作和轉(zhuǎn)換,而傳統(tǒng) JavaScript 則以更線性的方式處理數(shù)據(jù)。

如何在 RxJS 中創(chuàng)建可觀察對(duì)象?

在 RxJS 中,您可以使用新的 Observable() 構(gòu)造函數(shù)創(chuàng)建可觀察對(duì)象。此構(gòu)造函數(shù)將一個(gè)函數(shù)作為參數(shù),稱為訂閱者函數(shù),該函數(shù)在最初訂閱可觀察對(duì)象時(shí)執(zhí)行。這是一個(gè)基本示例:

const task_stream =
  // 創(chuàng)建所有數(shù)據(jù)庫中任務(wù)的流
  getTasks().
    // 只獲取此用戶的任務(wù)
    filter((task) => task.user_id == user_id).
    // 獲取未完成的任務(wù)
    filter((task) => !task.completed).
    // 只獲取任務(wù)名稱
    map((task) => task.name)

/* 任務(wù)如下所示:
   task = {
    user_id   : number,
    completed : boolean,
    name      : string
   }
 */

如何在 RxJS 中處理錯(cuò)誤?

RxJS 提供了幾個(gè)處理錯(cuò)誤的運(yùn)算符,例如 catchError()、retry() 和 retryWhen()。catchError() 運(yùn)算符用于捕獲可觀察流上的錯(cuò)誤并返回新的可觀察對(duì)象或拋出錯(cuò)誤。retry() 運(yùn)算符可用于在發(fā)生錯(cuò)誤時(shí)重新訂閱可觀察對(duì)象。retryWhen() 運(yùn)算符類似,但它提供了對(duì)何時(shí)重試的更多控制。

如何取消 RxJS 中可觀察對(duì)象的訂閱?

當(dāng)您訂閱可觀察對(duì)象時(shí),您會(huì)收到一個(gè) Subscription,它有一個(gè) unsubscribe() 方法。您可以調(diào)用此方法來取消可觀察對(duì)象的執(zhí)行并清理正在使用的任何資源。這是一個(gè)示例:

const task_stream =
  parameter_stream.
    debounce(1000).
    map((parameter) => {
      getTasks().
        retry(3).
        filter((task) => task.user_id === user_id).
        filter((task) => task.completed === parameter).
        map((task)    => task.name)
    }).
    flatMap(Rx.Observable.from).
    distinctUntilChanged().
    update()

RxJS 中熱可觀察對(duì)象和冷可觀察對(duì)象的區(qū)別是什么?

在 RxJS 中,可觀察對(duì)象可以是熱的或冷的。冷可觀察對(duì)象在訂閱時(shí)開始運(yùn)行,而熱可觀察對(duì)象即使在訂閱之前也會(huì)產(chǎn)生值。換句話說,冷可觀察對(duì)象是惰性的,而熱可觀察對(duì)象不是。

如何在 RxJS 中組合多個(gè)可觀察對(duì)象?

RxJS 提供了幾個(gè)組合多個(gè)可觀察對(duì)象的運(yùn)算符,例如 merge()、concat()、combineLatest() 和 zip()。這些運(yùn)算符中的每一個(gè)都以不同的方式組合數(shù)據(jù)流,具體取決于您的特定需求。

RxJS 中主題的目的是什么?

RxJS 中的主題是一種特殊類型的可觀察對(duì)象,它允許將值多播到多個(gè)觀察者。與普通可觀察對(duì)象不同,主題維護(hù)許多監(jiān)聽器的注冊(cè)表。

如何將 RxJS 與 Angular 一起使用?

Angular 內(nèi)置支持 RxJS,并在內(nèi)部將其用于各種功能。您也可以在自己的代碼中使用 RxJS 來處理異步操作并實(shí)現(xiàn)自動(dòng)完成、去抖動(dòng)、節(jié)流、輪詢等功能。

RxJS 的一些常見用例是什么?

RxJS 可用于需要處理異步數(shù)據(jù)的各種場(chǎng)景。一些常見的用例包括處理用戶輸入、發(fā)出 HTTP 請(qǐng)求、使用 WebSockets 和處理動(dòng)畫。

以上是10需要知道的RXJS功能與示例的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
如何在node.js中提出HTTP請(qǐng)求? 如何在node.js中提出HTTP請(qǐng)求? Jul 13, 2025 am 02:18 AM

在Node.js中發(fā)起HTTP請(qǐng)求有三種常用方式:使用內(nèi)置模塊、axios和node-fetch。1.使用內(nèi)置的http/https模塊無需依賴,適合基礎(chǔ)場(chǎng)景,但需手動(dòng)處理數(shù)據(jù)拼接和錯(cuò)誤監(jiān)聽,例如用https.get()獲取數(shù)據(jù)或通過.write()發(fā)送POST請(qǐng)求;2.axios是基于Promise的第三方庫,語法簡(jiǎn)潔且功能強(qiáng)大,支持async/await、自動(dòng)JSON轉(zhuǎn)換、攔截器等,推薦用于簡(jiǎn)化異步請(qǐng)求操作;3.node-fetch提供類似瀏覽器fetch的風(fēng)格,基于Promise且語法簡(jiǎn)單

JavaScript數(shù)據(jù)類型:原始與參考 JavaScript數(shù)據(jù)類型:原始與參考 Jul 13, 2025 am 02:43 AM

JavaScript的數(shù)據(jù)類型分為原始類型和引用類型。原始類型包括string、number、boolean、null、undefined和symbol,其值不可變且賦值時(shí)復(fù)制副本,因此互不影響;引用類型如對(duì)象、數(shù)組和函數(shù)存儲(chǔ)的是內(nèi)存地址,指向同一對(duì)象的變量會(huì)相互影響。判斷類型可用typeof和instanceof,但需注意typeofnull的歷史問題。理解這兩類差異有助于編寫更穩(wěn)定可靠的代碼。

React與Angular vs Vue:哪個(gè)JS框架最好? React與Angular vs Vue:哪個(gè)JS框架最好? Jul 05, 2025 am 02:24 AM

選哪個(gè)JavaScript框架最好?答案是根據(jù)需求選擇最適合的。1.React靈活自由,適合需要高度定制、團(tuán)隊(duì)有架構(gòu)能力的中大型項(xiàng)目;2.Angular提供完整解決方案,適合企業(yè)級(jí)應(yīng)用和長(zhǎng)期維護(hù)的大項(xiàng)目;3.Vue上手簡(jiǎn)單,適合中小型項(xiàng)目或快速開發(fā)。此外,是否已有技術(shù)棧、團(tuán)隊(duì)規(guī)模、項(xiàng)目生命周期及是否需要SSR也都是選擇框架的重要因素??傊?,沒有絕對(duì)最好的框架,適合自己需求的就是最佳選擇。

JavaScript時(shí)間對(duì)象,某人構(gòu)建了一個(gè)eactexe,在Google Chrome上更快的網(wǎng)站等等 JavaScript時(shí)間對(duì)象,某人構(gòu)建了一個(gè)eactexe,在Google Chrome上更快的網(wǎng)站等等 Jul 08, 2025 pm 02:27 PM

JavaScript開發(fā)者們,大家好!歡迎閱讀本周的JavaScript新聞!本周我們將重點(diǎn)關(guān)注:Oracle與Deno的商標(biāo)糾紛、新的JavaScript時(shí)間對(duì)象獲得瀏覽器支持、GoogleChrome的更新以及一些強(qiáng)大的開發(fā)者工具。讓我們開始吧!Oracle與Deno的商標(biāo)之爭(zhēng)Oracle試圖注冊(cè)“JavaScript”商標(biāo)的舉動(dòng)引發(fā)爭(zhēng)議。Node.js和Deno的創(chuàng)建者RyanDahl已提交請(qǐng)?jiān)笗?,要求取消該商?biāo),他認(rèn)為JavaScript是一個(gè)開放標(biāo)準(zhǔn),不應(yīng)由Oracle

處理諾言:鏈接,錯(cuò)誤處理和承諾在JavaScript中 處理諾言:鏈接,錯(cuò)誤處理和承諾在JavaScript中 Jul 08, 2025 am 02:40 AM

Promise是JavaScript中處理異步操作的核心機(jī)制,理解鏈?zhǔn)秸{(diào)用、錯(cuò)誤處理和組合器是掌握其應(yīng)用的關(guān)鍵。1.鏈?zhǔn)秸{(diào)用通過.then()返回新Promise實(shí)現(xiàn)異步流程串聯(lián),每個(gè).then()接收上一步結(jié)果并可返回值或Promise;2.錯(cuò)誤處理應(yīng)統(tǒng)一使用.catch()捕獲異常,避免靜默失敗,并可在catch中返回默認(rèn)值繼續(xù)流程;3.組合器如Promise.all()(全成功才成功)、Promise.race()(首個(gè)完成即返回)和Promise.allSettled()(等待所有完成)

什么是緩存API?如何與服務(wù)人員使用? 什么是緩存API?如何與服務(wù)人員使用? Jul 08, 2025 am 02:43 AM

CacheAPI是瀏覽器提供的一種緩存網(wǎng)絡(luò)請(qǐng)求的工具,常與ServiceWorker配合使用,以提升網(wǎng)站性能和離線體驗(yàn)。1.它允許開發(fā)者手動(dòng)存儲(chǔ)如腳本、樣式表、圖片等資源;2.可根據(jù)請(qǐng)求匹配緩存響應(yīng);3.支持刪除特定緩存或清空整個(gè)緩存;4.通過ServiceWorker監(jiān)聽fetch事件實(shí)現(xiàn)緩存優(yōu)先或網(wǎng)絡(luò)優(yōu)先等策略;5.常用于離線支持、加快重復(fù)訪問速度、預(yù)加載關(guān)鍵資源及后臺(tái)更新內(nèi)容;6.使用時(shí)需注意緩存版本控制、存儲(chǔ)限制及與HTTP緩存機(jī)制的區(qū)別。

利用Array.Prototype方法用于JavaScript中的數(shù)據(jù)操作 利用Array.Prototype方法用于JavaScript中的數(shù)據(jù)操作 Jul 06, 2025 am 02:36 AM

JavaScript數(shù)組內(nèi)置方法如.map()、.filter()和.reduce()可簡(jiǎn)化數(shù)據(jù)處理;1).map()用于一對(duì)一轉(zhuǎn)換元素生成新數(shù)組;2).filter()按條件篩選元素;3).reduce()用于聚合數(shù)據(jù)為單一值;使用時(shí)應(yīng)避免誤用導(dǎo)致副作用或性能問題。

JS綜述:深入研究JavaScript事件循環(huán) JS綜述:深入研究JavaScript事件循環(huán) Jul 08, 2025 am 02:24 AM

JavaScript的事件循環(huán)通過協(xié)調(diào)調(diào)用棧、WebAPI和任務(wù)隊(duì)列來管理異步操作。1.調(diào)用棧執(zhí)行同步代碼,遇到異步任務(wù)時(shí)交由WebAPI處理;2.WebAPI在后臺(tái)完成任務(wù)后將回調(diào)放入相應(yīng)的隊(duì)列(宏任務(wù)或微任務(wù));3.事件循環(huán)檢查調(diào)用棧是否為空,若為空則從隊(duì)列中取出回調(diào)推入調(diào)用棧執(zhí)行;4.微任務(wù)(如Promise.then)優(yōu)先于宏任務(wù)(如setTimeout)執(zhí)行;5.理解事件循環(huán)有助于避免阻塞主線程并優(yōu)化代碼執(zhí)行順序。

See all articles