深入淺出Rxjs筆記 一

一.函數(shù)式編程

函數(shù)式編程要求:

  • 聲明式
  • 純函數(shù)
  • 數(shù)據(jù)不可變
    js 不算純粹意義上的函數(shù)式編程語言吐根,但是,在js中函數(shù)被稱為一等公民专执,函數(shù)本身是一個(gè)對(duì)象飞几,所以可以作為一個(gè)變量,可以作為參數(shù)傳遞缩膝。
    純函數(shù)滿足的條件:
  • 函數(shù)的執(zhí)行過程完全由輸入?yún)?shù)決定混狠,不會(huì)受參數(shù)之外的任何數(shù)據(jù)影響
  • 函數(shù)不會(huì)修改任何外部狀態(tài),比如修改全局變量疾层,傳入的參數(shù)将饺。
    面向?qū)ο笏枷耄喊褦?shù)據(jù)封裝到類的實(shí)例對(duì)象,把數(shù)據(jù)藏起來痛黎,讓外部不能直接操作這些對(duì)象予弧,只能通過類提供的實(shí)例方法來讀取和修改這些操作,這樣就限制了對(duì)象的訪問方式
    FRP(Functional Reactive Programming)包含兩個(gè)重要元素:指令性和臨時(shí)的連續(xù)性

函數(shù)響應(yīng)式編程的優(yōu)勢(shì)

  • 數(shù)據(jù)流抽象了很多現(xiàn)實(shí)問題
  • 擅長(zhǎng)處理異步操作
  • 把復(fù)雜問題分解成簡(jiǎn)單問題的組合
    Rxjs擅長(zhǎng)處理異步操作湖饱,因?yàn)樗鼘?duì)數(shù)據(jù)采用推的處理方式掖蛤,當(dāng)一個(gè)數(shù)據(jù)產(chǎn)生的時(shí)候,就推送給對(duì)應(yīng)的處理函數(shù)井厌,這個(gè)處理函數(shù)不用關(guān)心數(shù)據(jù)是同步產(chǎn)生的還是異步產(chǎn)生的蚓庭,解決了處理異步的枷鎖。

二.RxJs入門

在webpack中有一個(gè)打包工具仅仆,tree-shaking,這個(gè)工具包的用處是在打包過程中發(fā)現(xiàn)根本沒有用上的函數(shù)器赞,最終在打包的文件中就不會(huì)包含進(jìn)去.
Tree-Shaking只會(huì)對(duì)import語句產(chǎn)生作用,對(duì)require語句不起效果墓拜,由于import只能在代碼頂層出現(xiàn)港柜,不可以使用if,而且被導(dǎo)入等等模塊一字符串常理出現(xiàn)咳榜,所以import完全滿足靜態(tài)分析的需求潘懊,但是require可以出現(xiàn)在if中參數(shù)也可以是動(dòng)態(tài)產(chǎn)生的字符串,只有在執(zhí)行時(shí)才會(huì)知道require如何執(zhí)行贿衍,所以tree-shaking對(duì)require不起效果

1. Observable和Observer

Observable: 被觀察者
Observer:觀察者
鏈接兩者的橋梁是Observable對(duì)象的函數(shù)subscrible
Observable實(shí)現(xiàn)了兩種設(shè)計(jì)模式:
觀察者模式 (Observer Pattern)/ 迭代器模式(Iteraor Pattern)
觀察者模式
觀察者模式要解決的問題,就是在一個(gè)持續(xù)產(chǎn)生事件的系統(tǒng)中如何分割功能救恨,讓不同模塊只需要處理一部分邏輯贸辈。
Observable對(duì)象就是一個(gè)發(fā)布者,通過Observable對(duì)象的subscribe函數(shù),可以把這個(gè)發(fā)布者和某個(gè)觀察者(observer)連接起來
迭代器模式
迭代者(Iterator)指的是能夠遍歷一個(gè)數(shù)據(jù)集合的對(duì)象擎淤,其作用就是提供一個(gè)通用的接口奢啥,讓使用者完全不關(guān)心這個(gè)數(shù)據(jù)集合的具體實(shí)現(xiàn)方式。
迭代器(又叫:游標(biāo) cursor)就像一個(gè)移動(dòng)的指針嘴拢,從集合中的一個(gè)元素移動(dòng)到另一個(gè)元素桩盲,完成對(duì)整個(gè)集合的遍歷
通常包含幾個(gè)函數(shù):

  • getCurrent:獲取當(dāng)前被游標(biāo)所指向的元素
  • moveToNext:將游標(biāo)移動(dòng)到下一個(gè)元素,調(diào)用這個(gè)函數(shù)之后席吴,getCurrent獲得的元素就會(huì)不同
  • isDone: 判斷是否已經(jīng)遍歷完所有的元素
    在rxjs中將觀察者模式和迭代器兩種模式結(jié)合起來的優(yōu)勢(shì):
    不需要主動(dòng)從observable中pull數(shù)據(jù)赌结,而是只要subscribe上observable對(duì)象之后,自然就能夠收到消息的推送
    Observable是永無止境的
    Observable對(duì)象每次只吐出一個(gè)數(shù)據(jù)孝冒,然后這個(gè)數(shù)據(jù)就被Observable消化處理了柬姚,不會(huì)存在數(shù)據(jù)的堆積
    和數(shù)組不同之處是,內(nèi)存的消耗會(huì)隨著數(shù)組的大小而改變庄涡。
    數(shù)據(jù)流是永無止境的量承。
    Observable在subscribe之后有四個(gè)狀態(tài):next / error / complete(完成) / dispose(退訂)
  • complete:調(diào)用complete之后不會(huì)再調(diào)用next,Observable告訴observer程序已經(jīng)完結(jié)
  • error :一旦調(diào)用error 之后表示Observable對(duì)象已經(jīng)完結(jié)穴店,不會(huì)再調(diào)用complete方法
  • dispose:有subscribe訂閱也就會(huì)有取消訂閱的操作(dispose),在dispose之后就不會(huì)再收到Observable產(chǎn)生的事件了

Hot Observable和Cold Observable

  • Hot Observable:概念上是有一個(gè)獨(dú)立于Observable對(duì)象的生產(chǎn)者撕捍,這個(gè)生產(chǎn)者的創(chuàng)建和subscribe調(diào)用沒有關(guān)系,subscribe調(diào)用只是讓Observer連接上生產(chǎn)者泣洞。
  • Cold Observable: 對(duì)每一次的subscribe都產(chǎn)生一個(gè)producer,然后這個(gè)producer產(chǎn)生的數(shù)據(jù)通過next函數(shù)傳遞給Observer
 Cold Observable
const cold$ = new Observable(observer => {
const producer = new producer()  
})


Hot Observable
const producer = new producer()  
const cold$ = new Observable(observer => {
})

小結(jié):

  • Observable和Observer是rxjs兩大主角忧风,這兩者的關(guān)系是觀察者和迭代器模式的結(jié)合,通過Observable對(duì)象的subscribe函數(shù)斜棚,可以讓一個(gè)Observer對(duì)象訂閱某個(gè)Observable對(duì)象的推送內(nèi)容阀蒂,也可以通過unsubscribe函數(shù)退訂內(nèi)容
  • 在 Observable和Observer兩者的關(guān)系里,Observer處于被動(dòng)地位弟蚀,在代碼中看不到Observer對(duì)象蚤霞,只可以看到next,error,complete的函數(shù)
  • Observable對(duì)象可以看作一個(gè)數(shù)據(jù)集合,但是這個(gè)數(shù)據(jù)集合可以不是一次產(chǎn)生的义钉,而是在一個(gè)時(shí)間段內(nèi)逐個(gè)產(chǎn)生數(shù)據(jù)昧绣,所以這就是一個(gè)Observable對(duì)象即使產(chǎn)生龐大的數(shù)據(jù),但是并不會(huì)消耗很多內(nèi)存的原因捶闸,因?yàn)槊看沃划a(chǎn)生一個(gè)吐出來之后在產(chǎn)生另一個(gè)夜畴,不會(huì)積壓
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市删壮,隨后出現(xiàn)的幾起案子贪绘,更是在濱河造成了極大的恐慌,老刑警劉巖央碟,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件税灌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)菱涤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門苞也,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人粘秆,你說我怎么就攤上這事如迟。” “怎么了攻走?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵殷勘,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我陋气,道長(zhǎng)劳吠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任巩趁,我火速辦了婚禮痒玩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘议慰。我一直安慰自己蠢古,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布别凹。 她就那樣靜靜地躺著草讶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪炉菲。 梳的紋絲不亂的頭發(fā)上堕战,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音拍霜,去河邊找鬼嘱丢。 笑死,一個(gè)胖子當(dāng)著我的面吹牛祠饺,可吹牛的內(nèi)容都是我干的越驻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼道偷,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼缀旁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起勺鸦,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤并巍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后换途,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體懊渡,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嘶窄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了距贷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吻谋,死狀恐怖忠蝗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情漓拾,我是刑警寧澤阁最,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站骇两,受9級(jí)特大地震影響速种,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜低千,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一配阵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧示血,春花似錦棋傍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至告喊,卻和暖如春麸拄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背黔姜。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工拢切, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人地淀。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像帮毁,于是被迫代替她去往敵國(guó)和親实苞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容