RxJS流由幾個基本組件組成燥翅,對于整個流扒接,每個組件都有相關(guān)的特定任務(wù)和生命周期。接下來給大家一一介紹:
- Producers
- Consumers
- Data pipeline
- Time
Producers
Producers是數(shù)據(jù)的來源盖腿。流必須始終有一個數(shù)據(jù)生產(chǎn)者诫隅,它將是在RxJS中執(zhí)行的任何邏輯的起點。實際上咧最,生產(chǎn)者是由獨立生成事件的東西創(chuàng)建的(從單個值捂人、數(shù)組御雕、鼠標(biāo)單擊到從文件讀取的字節(jié)流)。觀察者模式將生產(chǎn)者定義為Subject
先慷;在RxJS中饮笛,我們稱它們?yōu)?code>Observables,就像在一些可觀察的東西中一樣论熙。
Observables
負責(zé)推送通知福青,因此我們將這種行為稱為fire-and-forget,這意味著我們永遠不會期望生產(chǎn)者參與事件的處理脓诡,只會參與事件的發(fā)射无午。
Consumers
與生產(chǎn)者相對應(yīng)的是,我們必須還有一個消費者來接受生產(chǎn)者的事件并以某種特定的方式處理它們祝谚。當(dāng)消費者開始偵聽生產(chǎn)者以獲取要消費的事件時宪迟,此時就生成了一個stream
,并開始推送事件交惯。我們將把消費者稱為Observer
次泽。
流只從生產(chǎn)者到消費者傳播,而不是相反席爽。換句話說意荤,用戶在鍵盤上鍵入時會產(chǎn)生一些事件,這些事件將被其他進程消費只锻。這就意味著理解了流就能知道如何將將應(yīng)用程序的各個部分確定為上游或下游玖像,從而確定數(shù)據(jù)將流動的方向。對于RxJS齐饮,流總是從上游的可觀察對象流到下游的觀察者捐寥,這兩個組件是松散耦合的,這增加了應(yīng)用程序的模塊性祖驱,如下圖所示握恳。
例如,鍵盤事件處理程序?qū)⑽挥谏嫌无嗥В驗樗簧a(chǎn)事件睡互,而不消費事件,而應(yīng)該基于按鍵執(zhí)行邏輯的代碼將位于下游陵像。在基本級別上就珠,流只需要生產(chǎn)者和消費者。一旦后者能夠開始接收來自前者的事件醒颖,您就有效地創(chuàng)建了一個流∑拊酰現(xiàn)在你能用這些數(shù)據(jù)做什么?所有這些都發(fā)生在數(shù)據(jù)管道中。
Data Pipeline
RxJS的一個優(yōu)勢是泞歉,您可以在數(shù)據(jù)從生產(chǎn)者傳遞到消費者時操作或編輯數(shù)據(jù)逼侦。這就是Rxjs方法列(observable operators)發(fā)揮作用的地方匿辩。在路由中操作數(shù)據(jù)意味著我們可以將生產(chǎn)者產(chǎn)生的數(shù)據(jù)轉(zhuǎn)化成消費者所需要的數(shù)據(jù)。這樣做會促進生產(chǎn)者和消費者的解耦(單一原則)榛丢,這對于代碼的模塊化來說是一個巨大的勝利铲球。這種設(shè)計原則在大型JavaScript應(yīng)用程序中通常很難實現(xiàn),但是RxJS簡化了這種設(shè)計模型晰赞。
Time
所有這些背后的隱含因素是Time
稼病。對于RxJS,所有拿來處理stream
的東西背后都有一個基本的時間概念掖鱼。時間因素滲透到我們目前討論過的所有組成部分然走。這是一個需要掌握的重要又抽象的概念,后面會詳細討論∠返玻現(xiàn)在芍瑞,只需要了解Time
并不總是以正常的速度運行,可以構(gòu)建運行得更慢或更快的流褐墅,這取決于自己的需求拆檬。幸運的是,如果決定使用RxJS妥凳,這不會成為問題秩仆。下圖展示了一個RxJS流: