翻譯ReactiveX設(shè)計概覽

官方文檔鏈接:http://reactivex.io/documentation/observable.html

1.前言


ReactiveX的概念是惩坑,一個觀察者訂閱一個被觀察者,然后觀察者響應(yīng)被觀察者產(chǎn)生/傳遞的每一個事件或事件隊列丐膝。這種模式有利于并發(fā)操作捐友,當(dāng)?shù)却挥^察者產(chǎn)生/傳遞事件時淫半,不需要阻塞線程,而是創(chuàng)建觀察者匣砖,隨時準(zhǔn)備響應(yīng)被觀察者將來時間做出的事情科吭。

這節(jié)介紹什么是響應(yīng)模式,什么是觀察者和被觀察者(以及觀察者如何訂閱被觀察者)脆粥。以后將介紹如何使用各種被觀察者的操作符來連接被觀察者和改變他們行為砌溺。文檔附帶解釋用的圖表,下面示例反映圖表如何展示被觀察者和它的轉(zhuǎn)換:

Legend.png

2.被觀察者


可以理解為數(shù)據(jù)源变隔,內(nèi)部封裝了一系列事件等待自己來調(diào)用规伐,從而傳遞出去(產(chǎn)生事件)。

參考的文章:

3.異步處理


在許多軟件開發(fā)任務(wù)中匣缘,或多或少期望猖闪,編寫的指令按照書寫順序,依次執(zhí)行肌厨,逐步完成培慌。但在ReactiveX中,許多指令可以并行執(zhí)行柑爸,并由觀察者按任意順序捕獲相應(yīng)結(jié)果吵护。與方法調(diào)用相比,先定義被觀察者,然后用觀察者訂閱的模式來檢索和轉(zhuǎn)換數(shù)據(jù)馅而,隨時準(zhǔn)備著在某個時間點(diǎn)捕獲和響應(yīng)事件的發(fā)生祥诽。這種方式有一個好處,當(dāng)有一堆互不依賴的任務(wù)時瓮恭,讓它們同時開始比等待上一個結(jié)束再開始下一個要好雄坪,因?yàn)樗腥蝿?wù)完成消耗的時間只由耗時最長的任務(wù)決定。

有不少術(shù)語來描述這種異步編程和設(shè)計的模型屯蹦,本文將采用:觀察者訂閱被觀察者维哈。被觀察者通過調(diào)用觀察者的方法來傳遞事件和發(fā)送通知給自己的觀察者。在后面的文章中登澜,有時會稱呼“觀察者”為“訂閱者”阔挠、“監(jiān)視者”、“響應(yīng)者”帖渠,這種模型通常也被稱為“響應(yīng)模式”谒亦。

4.創(chuàng)建觀察者


下面的例子將使用類似Groovy的偽代碼,因?yàn)镽eactiveX在多種語言下都有實(shí)現(xiàn)空郊。

普通方法調(diào)用——不是那種異步的份招、ReactiveX中典型的并行調(diào)用——流程就像這樣:

  • 調(diào)用一個方法。
  • 一個變量存儲那個方法返回的值狞甚。
  • 用那個變量和它的新值做一些有意義的事锁摔。
// make the call, assign its return value to `returnVal`
returnVal = someMethod(itsParameters);
// do something useful with returnVal

在異步模型中,流程更像這樣:

  • 定義一個方法哼审,使用異步調(diào)用返回的值做一些有意義的事谐腰;這個方法是觀察者的一部分。
  • 定義異步調(diào)用本身作為被觀察者涩盾。
  • 通過觀察者訂閱被觀察者來關(guān)聯(lián)兩者(這一步引發(fā)被觀察者產(chǎn)生事件)十气。
  • 繼續(xù)業(yè)務(wù)邏輯;每當(dāng)調(diào)用返回時春霍,觀察者方法將開始對返回的值(被觀察者產(chǎn)生的事件)執(zhí)行操作砸西。
// defines, but does not invoke, the Subscriber's onNext handler
// (in this example, the observer is very simple and has only an onNext handler)
def myOnNext = { it -> do something useful with it };
// defines, but does not invoke, the Observable
def myObservable = someObservable(itsParameters);
// subscribes the Subscriber to the Observable, and invokes the Observable
myObservable.subscribe(myOnNext);
// go on about my business
4.1.觀察的事件

若觀察者要通過subscribe()方法與被觀察者連接起來,需實(shí)現(xiàn)下面方法的一些子集

onNext()每當(dāng)被觀察者產(chǎn)生一個事件址儒,它將調(diào)用這個方法芹枷,并使用它產(chǎn)生的事件作為參數(shù)。

onError()被觀察者調(diào)用這個方法莲趣,表明它未能生成預(yù)期的數(shù)據(jù)鸳慈,或者遇到一些其它的錯誤,將不會接著調(diào)用onNext()onCompleted()方法喧伞。onError()方法使用導(dǎo)致錯誤的指示走芋,作為它的參數(shù)绩郎。

onCompleted()被觀察者調(diào)用onNext()方法之后,且沒有遇到任何問題翁逞,當(dāng)結(jié)束事件的產(chǎn)生時嗽上,它調(diào)用這個方法。

被觀察者可能調(diào)用onNext()方法零次或多次熄攘,之后可能調(diào)用onCompleted()onError()方法中的一種,作為最終調(diào)用彼念。這里約定一下挪圾,文章中調(diào)用onNext()方法稱為“產(chǎn)生事件”,而調(diào)用onCompleted()onError()方法稱為“發(fā)送通知”逐沙。

def myOnNext     = { item -> /* do something useful with item */ };
def myError      = { throwable -> /* react sensibly to a failed call */ };
def myComplete   = { /* clean up after the final response */ };
def myObservable = someMethod(itsParameters);
myObservable.subscribe(myOnNext, myError, myComplete);
// go on about my business

可以參考這篇文章 Introduction to Rx: IObserver

4.2.取消訂閱

有一些ReactiveX的實(shí)現(xiàn)哲思,定義了專門的觀察者,即訂閱者吩案,實(shí)現(xiàn)了取消訂閱的方法棚赔。調(diào)用這個方法表明,訂閱者不再關(guān)心當(dāng)前訂閱的任何一個被觀察者徘郭。那些被觀察者(如果它們沒有被其它觀察者訂閱)之后可以選擇停止產(chǎn)生新的事件靠益。取消訂閱的結(jié)果,將會回溯觀察者訂閱被觀察者時使用的操作鏈残揉,并且將導(dǎo)致鏈中的每個節(jié)點(diǎn)停止傳遞事件(封裝在被觀察者對象中)胧后。但這個過程不能保證立即發(fā)生,被觀察者有可能產(chǎn)生并嘗試傳遞事件抱环,即使沒有觀察者再訂閱它壳快,仍能持續(xù)一段時間。

4.3.命名規(guī)則

每種特定語言對ReactiveX的實(shí)現(xiàn)镇草,有許多共同點(diǎn)眶痰,但沒有規(guī)范的命名標(biāo)準(zhǔn)。因?yàn)樗鼈兌加凶约旱拿?xí)慣梯啤,而且這些名字在不同的上下文中有不同的含義竖伯,或者不符合特定實(shí)現(xiàn)語言的習(xí)慣。

5.被觀察者類型


由被觀察者的類型条辟,決定什么時候產(chǎn)生它自己的事件隊列黔夭。熱類型,在它被創(chuàng)建時會開始產(chǎn)生事件羽嫡,之后任何觀察者再訂閱它本姥,可能從隊列中間的某處開始捕獲。冷類型杭棵,則相反婚惫,等到有觀察者訂閱它才開始產(chǎn)生事件氛赐,所以能保證觀察者從開始捕獲整個隊列。

在ReactiveX的一些實(shí)現(xiàn)中先舷,有一些被稱為可連接的被觀察者艰管。這樣的被觀察者不會開始產(chǎn)生事件直到它的connect()方法被調(diào)用,不管是否有觀察者已經(jīng)訂閱它蒋川。

6.總結(jié)


理解被觀察者和觀察者牲芋,不過才剛剛接觸ReactiveX的概念。它們本身只能算是對標(biāo)準(zhǔn)觀察者模式(若有不清楚此模式的捺球,后期會在設(shè)計模式文集中加以說明)輕微的擴(kuò)展缸浦,以便適合處理一系列事件。

ReactiveX真正的核心氮兵,是通過操作符改變裂逐、組合和控制被觀察者產(chǎn)生的事件隊列。尤其允許將異步事件的隊列組合在一個聲明中泣栈,保留回調(diào)所有的優(yōu)點(diǎn)卜高,但沒有回調(diào)嵌套處理的缺點(diǎn)。下一節(jié)將詳細(xì)給大家講解這些神奇的操作符南片。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掺涛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子疼进,更是在濱河造成了極大的恐慌鸽照,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颠悬,死亡現(xiàn)場離奇詭異矮燎,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)赔癌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門诞外,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人灾票,你說我怎么就攤上這事峡谊。” “怎么了刊苍?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵既们,是天一觀的道長。 經(jīng)常有香客問我正什,道長啥纸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任婴氮,我火速辦了婚禮斯棒,結(jié)果婚禮上盾致,老公的妹妹穿的比我還像新娘。我一直安慰自己荣暮,他們只是感情好庭惜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著穗酥,像睡著了一般护赊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上砾跃,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天百揭,我揣著相機(jī)與錄音,去河邊找鬼蜓席。 笑死,一個胖子當(dāng)著我的面吹牛课锌,可吹牛的內(nèi)容都是我干的厨内。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼渺贤,長吁一口氣:“原來是場噩夢啊……” “哼雏胃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起志鞍,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瞭亮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后固棚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體统翩,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年此洲,在試婚紗的時候發(fā)現(xiàn)自己被綠了厂汗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡呜师,死狀恐怖娶桦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情汁汗,我是刑警寧澤衷畦,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站知牌,受9級特大地震影響祈争,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜角寸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一铛嘱、第九天 我趴在偏房一處隱蔽的房頂上張望暖释。 院中可真熱鬧,春花似錦墨吓、人聲如沸球匕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亮曹。三九已至,卻和暖如春秘症,著一層夾襖步出監(jiān)牢的瞬間照卦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工乡摹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留役耕,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓聪廉,卻偏偏與公主長得像瞬痘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子板熊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

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