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

目錄
關(guān)鍵要點(diǎn)
反應(yīng)式編程
與數(shù)組的關(guān)係
熟悉 RxJS
簡單流操作
1. 使用 map() 轉(zhuǎn)換數(shù)據(jù)
2. 過濾結(jié)果
3. 使用 reduce() 收集結(jié)果
4. 使用 take() 限制結(jié)果
高階流操作
5. 使用 flatMap() 壓平流
來自 promise 的可觀察對象
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)建可觀察對象?
RxJS 中的主要運(yùn)算符是什麼以及它們?nèi)绾喂ぷ鳎?
如何在 RxJS 中處理錯誤?
如何取消 RxJS 中可觀察對象的訂閱?
RxJS 中熱可觀察對象和冷可觀察對象的區(qū)別是什麼?
如何在 RxJS 中組合多個(gè)可觀察對象?
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 共同評審。感謝所有 SitePoint 的同行評審員,使 SitePoint 的內(nèi)容盡善盡美!

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

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

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

  • RxJS 利用類似於隨時(shí)間推移填充的數(shù)組的可觀察對象來促進(jìn)函數(shù)式反應(yīng)式編程 (FRP),從而允許在應(yīng)用程序中進(jìn)行更聲明式和強(qiáng)大的錯誤處理。
  • RxJS 中簡單流的核心操作,例如 map()filter()、reduce()take(),鏡像數(shù)組操作,但應(yīng)用於隨時(shí)間發(fā)出值的數(shù)流。
  • flatMap()switch() 這樣的專用函數(shù)對於分別處理複雜數(shù)據(jù)結(jié)構(gòu)和管理多個(gè)流至關(guān)重要,這使得它們對於高級反應(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)式編程是一種編程範(fàn)例,它將稱為可觀察對象的數(shù)據(jù)流作為其基本的編程單元。

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

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

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

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

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

另一方面,可觀察對象由時(shí)間定義。您最多只能知道流到目前為止已接收 [1, 2, 3]。您不能確定您是否會得到 4——或者不會——並且是數(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)格。

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

  • 響應(yīng)用戶選擇查看已完成或未完成的任務(wù)來啟動請求;
  • 每秒只發(fā)送對上次選擇的請求一次,以免在用戶快速更改選擇時(shí)浪費(fèi)帶寬;
  • 最多重試三次失敗的請求;以及
  • 只有當(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ù),並將選擇存儲在 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. 簡單直接、強(qiáng)大的錯誤處理。

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

簡單流操作

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

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

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

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

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

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

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

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

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

  1. 它返回一個(gè)新的可觀察對象,而不是一個(gè)新的數(shù)組;以及
  2. 它在可觀察對象發(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è)用戶對象替換為每個(gè)用戶的網(wǎng)站。

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

2. 過濾結(jié)果

像 map() 一樣,filter() 在可觀察對像上的作用與在數(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è)對象,該對象計(jì)算我們找到的網(wǎng)站數(shù)量以及其名稱長度的總和。

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

在這裡,我們將流簡化為單個(gè)對象,它跟蹤:

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

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

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

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

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

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

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

RxJS 還提供 takeWhile(),它允許您在某個(gè)布爾測試成立之前獲取值。我們可以這樣使用 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 })

高階流操作

除了它們在可觀察對象而不是數(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ù)組可以包含比簡單值(如數(shù)組或?qū)ο螅└}雜的數(shù)據(jù)一樣,可觀察對像也可以發(fā)出高階數(shù)據(jù),如 Promise 或其他可觀察對象。這就是更專業(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 的可觀察對象

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

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

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

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

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

6. 使用 flatMap()

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

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

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

在我們的例子中,我們傳遞 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
   }
 */

這涵蓋了我們簡短序言中的代碼:

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ā)出任何活動流的值來從多個(gè)流創(chuàng)建新流

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

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

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

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

8. 使用 switch()

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

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

為此,RxJS 提供了 switch。

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

順便說一下,我們應(yīng)該確保不要浪費(fèi)帶寬,而只針對用戶每秒進(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)任一流的更改

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

  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() 都會獲取發(fā)出的值並將其與其他流發(fā)出的最後一個(gè)項(xiàng)目配對,並將該對以數(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è)流的更改

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

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

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

與 combineLatest() 不同,zip() 會等到兩個(gè)可觀察對像都發(fā)出新內(nèi)容後才會發(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í)間維度就開啟了對程序進(jìn)行全新思考的大門。

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

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

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

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

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

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

在 RxJS 中,您可以使用新的 Observable() 構(gòu)造函數(shù)創(chuàng)建可觀察對象。此構(gòu)造函數(shù)將一個(gè)函數(shù)作為參數(shù),稱為訂閱者函數(shù),該函數(shù)在最初訂閱可觀察對象時(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 中處理錯誤?

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

如何取消 RxJS 中可觀察對象的訂閱?

當(dāng)您訂閱可觀察對象時(shí),您會收到一個(gè) Subscription,它有一個(gè) unsubscribe() 方法。您可以調(diào)用此方法來取消可觀察對象的執(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 中熱可觀察對象和冷可觀察對象的區(qū)別是什麼?

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

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

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

RxJS 中主題的目的是什麼?

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

如何將 RxJS 與 Angular 一起使用?

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

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

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

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

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

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版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
垃圾收集如何在JavaScript中起作用? 垃圾收集如何在JavaScript中起作用? Jul 04, 2025 am 12:42 AM

JavaScript的垃圾回收機(jī)制通過標(biāo)記-清除算法自動管理內(nèi)存,以減少內(nèi)存洩漏風(fēng)險(xiǎn)。引擎從根對像出發(fā)遍歷並標(biāo)記活躍對象,未被標(biāo)記的則被視為垃圾並被清除。例如,當(dāng)對像不再被引用(如將變量設(shè)為null),它將在下一輪迴收中被釋放。常見的內(nèi)存洩漏原因包括:①未清除的定時(shí)器或事件監(jiān)聽器;②閉包中對外部變量的引用;③全局變量持續(xù)持有大量數(shù)據(jù)。 V8引擎通過分代回收、增量標(biāo)記、並行/並發(fā)回收等策略優(yōu)化回收效率,降低主線程阻塞時(shí)間。開發(fā)時(shí)應(yīng)避免不必要的全局引用、及時(shí)解除對象關(guān)聯(lián),以提升性能與穩(wěn)定性。

如何在node.js中提出HTTP請求? 如何在node.js中提出HTTP請求? Jul 13, 2025 am 02:18 AM

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

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

JavaScript的數(shù)據(jù)類型分為原始類型和引用類型。原始類型包括string、number、boolean、null、undefined和symbol,其值不可變且賦值時(shí)復(fù)制副本,因此互不影響;引用類型如對象、數(shù)組和函數(shù)存儲的是內(nèi)存地址,指向同一對象的變量會相互影響。判斷類型可用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è)級應(yīng)用和長期維護(hù)的大項(xiàng)目;3.Vue上手簡單,適合中小型項(xiàng)目或快速開發(fā)。此外,是否已有技術(shù)棧、團(tuán)隊(duì)規(guī)模、項(xiàng)目生命週期及是否需要SSR也都是選擇框架的重要因素??傊瑳]有絕對最好的框架,適合自己需求的就是最佳選擇。

JavaScript時(shí)間對象,某人構(gòu)建了一個(gè)eactexe,在Google Chrome上更快的網(wǎng)站等等 JavaScript時(shí)間對象,某人構(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í)間對象獲得瀏覽器支持、GoogleChrome的更新以及一些強(qiáng)大的開發(fā)者工具。讓我們開始吧! Oracle與Deno的商標(biāo)之爭Oracle試圖註冊“JavaScript”商標(biāo)的舉動引發(fā)爭議。 Node.js和Deno的創(chuàng)建者RyanDahl已提交請願書,要求取消該商標(biāo),他認(rèn)為JavaScript是一個(gè)開放標(biāo)準(zhǔn),不應(yīng)由Oracle

立即在JavaScript中立即調(diào)用功能表達(dá)式(IIFE) 立即在JavaScript中立即調(diào)用功能表達(dá)式(IIFE) Jul 04, 2025 am 02:42 AM

IIFE(ImmediatelyInvokedFunctionExpression)是一種在定義後立即執(zhí)行的函數(shù)表達(dá)式,用於變量隔離和避免污染全局作用域。它通過將函數(shù)包裹在括號中使其成為表達(dá)式,並緊隨其後的一對括號來調(diào)用,如(function(){/code/})();。其核心用途包括:1.避免變量衝突,防止多個(gè)腳本間的命名重複;2.創(chuàng)建私有作用域,使函數(shù)內(nèi)部變量不可見;3.模塊化代碼,便於初始化工作而不暴露過多變量。常見寫法包括帶參數(shù)傳遞的版本和ES6箭頭函數(shù)版本,但需注意:必須使用表達(dá)式、結(jié)

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

Promise是JavaScript中處理異步操作的核心機(jī)制,理解鍊式調(diào)用、錯誤處理和組合器是掌握其應(yīng)用的關(guān)鍵。 1.鍊式調(diào)用通過.then()返回新Promise實(shí)現(xiàn)異步流程串聯(lián),每個(gè).then()接收上一步結(jié)果並可返回值或Promise;2.錯誤處理應(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ò)請求的工具,常與ServiceWorker配合使用,以提升網(wǎng)站性能和離線體驗(yàn)。 1.它允許開發(fā)者手動存儲如腳本、樣式表、圖片等資源;2.可根據(jù)請求匹配緩存響應(yīng);3.支持刪除特定緩存或清空整個(gè)緩存;4.通過ServiceWorker監(jiān)聽fetch事件實(shí)現(xiàn)緩存優(yōu)先或網(wǎng)絡(luò)優(yōu)先等策略;5.常用於離線支持、加快重複訪問速度、預(yù)加載關(guān)鍵資源及後臺更新內(nèi)容;6.使用時(shí)需注意緩存版本控制、存儲限制及與HTTP緩存機(jī)制的區(qū)別。

See all articles