官方文檔鏈接:http://reactivex.io/documentation/operators.html
1.前言
每種實(shí)現(xiàn)了ReactiveX的語言都有一套操作符,并且命名上趨向于該語言下那些已經(jīng)熟悉的、功能類似的方法概荷。雖然這些實(shí)現(xiàn)之間有許多相同的部分式曲,但也有些操作符只在特定語言中存在。
2.操作鏈
大多數(shù)操作符作用于被觀察者,并返回被觀察者。這就允許操作符如鏈條一樣,一個(gè)接著一個(gè)瞻离,導(dǎo)致每個(gè)操作符可以修改上一個(gè)操作符處理后的被觀察者(操作鏈不直接作用于鏈最開始的那個(gè)被觀察者,而是依次執(zhí)行乒裆,每個(gè)操作符作用的被觀察者由緊挨著它的上一個(gè)操作符生成)套利。
還有其它模式允許以相似的方式鏈接方法,比如建造者模式缸兔,指定類有一系列方法可以對自己操作日裙,通過調(diào)用這些方法修改類的實(shí)例。但對它而言惰蜜,方法在鏈中出現(xiàn)的順序通常不重要昂拂,而被觀察者的操作符則關(guān)注順序。
3.創(chuàng)建被觀察者
產(chǎn)生新的被觀察者的操作符抛猖。
-
Empty / Never / Throw — 創(chuàng)建有非常明確和限制性行為的被觀察者格侯。
Empty / Never / Throw.pngempty()
、never()
和throw()
操作符對測試有幫助财著,有時(shí)也結(jié)合其它被觀察者或作為操作符的參數(shù)联四。 -
Create — 通過程序地調(diào)用觀察者的方法,從頭創(chuàng)建一個(gè)被觀察者撑教。
Create.pngcreate()
操作符從頭創(chuàng)建一個(gè)被觀察者朝墩。給這個(gè)操作符傳入支持觀察者的函數(shù)(這是函數(shù)式編程的概念,可以理解為匿名內(nèi)部類)作為參數(shù)伟姐,并將函數(shù)的行為當(dāng)作被觀察的目標(biāo)收苏,比如適當(dāng)?shù)卣{(diào)用觀察者的onNext()
、onError()
和onCompleted()
方法愤兵。一個(gè)良好定義的被觀察者必須嘗試調(diào)用觀察者的onCompleted()
方法一次或它的onError()
方法一次鹿霸,此后不再嘗試調(diào)用觀察者的任何其它方法。參考的文章:
-
Defer — 直到觀察者訂閱后才創(chuàng)建被觀察者秆乳,并且為每個(gè)觀察者創(chuàng)建新的被觀察者懦鼠。
Defer.pngdefer()
操作符直到觀察者訂閱了它钻哩,才根據(jù)被觀察者工廠函數(shù)生成被觀察者。為每個(gè)訂閱者重復(fù)以上步驟肛冶,盡管它們可能會認(rèn)為自己訂閱的是同一個(gè)被觀察者(實(shí)際上每個(gè)訂閱者獲得了專屬自己的事件隊(duì)列)街氢。某些情況下,等到最后時(shí)刻(指訂閱的時(shí)刻)生成被觀察者能保證它包含最新的數(shù)據(jù)睦袖。參考這篇文章 Deferring Observable code until subscription in RxJava by Dan Lew
-
Start — 創(chuàng)建一個(gè)被觀察者阳仔,將一個(gè)函數(shù)的返回值作為事件產(chǎn)生。
Start.png編程語言有許多方式獲取計(jì)算結(jié)果的值扣泊,它們被稱為functions、futures嘶摊、actions延蟹、callables、runnables叶堆,等阱飘。集聚在
start()
操作符類別下的這些操作行為與被觀察者類似,可以與其它被觀察者結(jié)合使用虱颗。參考的文章:
-
From — 將各種其它對象或數(shù)據(jù)結(jié)構(gòu)(含有多個(gè)元素)轉(zhuǎn)變?yōu)橐粋€(gè)被觀察者(每個(gè)元素都是一個(gè)事件)沥匈。
From.pngfrom()
操作符可以很方便地將需要處理的所有數(shù)據(jù)表現(xiàn)為被觀察者,而不是混雜著被觀察者和其它類型忘渔。這允許使用一套操作符來管理數(shù)據(jù)流的整個(gè)有效期高帖。Iterables,可以被認(rèn)為是一種同步執(zhí)行的被觀察者畦粮;Futures(Java中指異步執(zhí)行)散址,則認(rèn)為是一種只產(chǎn)生單一事件的被觀察者。通過將這些對象顯式轉(zhuǎn)換成被觀察者宣赔,允許它們像普通被觀察者一樣調(diào)用预麸。出于這個(gè)原因,大多數(shù)ReactiveX的實(shí)現(xiàn)都有方法將某一特定語言對象和數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換成被觀察者儒将。參考的文章:
-
Just — 將一個(gè)或一系列對象轉(zhuǎn)換成一個(gè)產(chǎn)生一個(gè)或多個(gè)事件的被觀察者吏祸。
Just.pngjust()
操作符和from()
操作符類似。但得注意钩蚊,前者將數(shù)組贡翘、迭代器等簡單地當(dāng)作一個(gè)事件產(chǎn)生,不做改變两疚;而后者將這些類型拆成單獨(dú)的事件產(chǎn)生床估。注意,如果給just()
操作符傳null诱渤,將返回產(chǎn)生事件為null的被觀察者丐巫。不要犯這種錯(cuò)誤,因?yàn)闀祷匾粋€(gè)空的被觀察者(不產(chǎn)生任何事件)。若需要這種情況递胧,建議使用empty()
操作符碑韵。參考的文章:
-
Repeat — 創(chuàng)建一個(gè)被觀察者,重復(fù)地產(chǎn)生某特定的事件或事件隊(duì)列缎脾。
Repeat.pngrepeat()
操作符重復(fù)地產(chǎn)生一個(gè)事件祝闻,別的實(shí)現(xiàn)允許重復(fù)產(chǎn)生事件隊(duì)列或設(shè)置重復(fù)的次數(shù)。參考的文章:
-
Timer — 創(chuàng)建一個(gè)被觀察者遗菠,在給定的延遲后產(chǎn)生一個(gè)特定的事件联喘。
Timer.png參考的文章:
-
Interval — 創(chuàng)建一個(gè)被觀察者,每隔指定時(shí)間產(chǎn)生一個(gè)整數(shù)辙纬。
Interval.pnginterval()
操作符返回一個(gè)被觀察者豁遭,它產(chǎn)生一個(gè)遞增的整數(shù)的無窮序列,并且元素間保持著固定的時(shí)間間隔贺拣。參考的文章:
-
Range — 創(chuàng)建一個(gè)產(chǎn)生特定范圍內(nèi)若干連續(xù)整數(shù)的被觀察者蓖谢。
Range.pngrange()
操作符根據(jù)確定的開始位置和范圍長度,按順序產(chǎn)生一系列整數(shù)譬涡。參考的文章:
4.改變被觀察者
改變被觀察者產(chǎn)生的事件的操作符闪幽。由于以后講的操作符不處于操作鏈?zhǔn)撞浚阅J(rèn)為傳遞事件涡匀,實(shí)際上是內(nèi)部創(chuàng)建的被觀察者產(chǎn)生事件盯腌。同時(shí),約定操作符之前的被觀察者稱為原始被觀察者陨瘩,它產(chǎn)生的事件為原始事件腊嗡。
-
Buffer — 定期收集被觀察者的事件,每次傳遞事件的集合而不是單個(gè)事件拾酝。
Buffer.pngbuffer()
操作符將每次產(chǎn)生單個(gè)事件的被觀察者改變?yōu)槊看蝹鬟f緩沖的事件集合的被觀察者燕少。它在不同的特定語言實(shí)現(xiàn)中是不一樣的,區(qū)別在于如何選擇哪個(gè)事件進(jìn)哪個(gè)緩存區(qū)蒿囤。需注意的是客们,如果原始被觀察者發(fā)布一個(gè)onError()
通知,buffer()
操作符將立即傳遞這個(gè)通知材诽。不管準(zhǔn)備傳遞的集合是處于收集的過程中底挫,還是在通知發(fā)布之前已經(jīng)收集好了。參考的文章:
-
Window — 定期劃分被觀察者的事件到不同的視窗脸侥,每次傳遞這些視窗而不是單個(gè)事件建邓。
Window.pngwindow()
操作符和buffer()
操作符類似。但相較于后者通過數(shù)據(jù)結(jié)構(gòu)容納事件并傳遞睁枕;前者則是新建被觀察者官边,每一個(gè)都傳遞原始事件的子集沸手,并由一個(gè)onCompleted()
通知終止。與
buffer()
操作符一樣注簿,window()
操作符有許多種實(shí)現(xiàn)契吉,每種都用自己的方式將原始被觀察者劃分為多個(gè)被觀察者,它們將分別包含的原始事件統(tǒng)稱視窗诡渴。在window()
操作符的術(shù)語中捐晶,當(dāng)一個(gè)視窗打開,意味著一個(gè)新的被觀察者將開始傳遞原始事件妄辩;當(dāng)那個(gè)視窗關(guān)閉惑灵,意味著那個(gè)被觀察者停止傳遞原始事件,并給自己的觀察者發(fā)送一個(gè)onCompleted()
通知來終止眼耀。參考的文章:
-
GroupBy — 將一個(gè)被觀察者劃分成一系列被觀察者泣棋,其中每個(gè)被觀察者傳遞按鍵值區(qū)分的不同的原始事件的子集。
GroupBy.pnggroupBy()
操作符將一個(gè)產(chǎn)生事件的被觀察者劃分成多個(gè)畔塔,每個(gè)僅傳遞原始事件的子集。哪些事件最終屬于哪個(gè)被觀察者鸯屿,通常由一個(gè)判別函數(shù)(評估每個(gè)事件并指派它鍵值)決定澈吨。所有擁有相同鍵值的事件需同一個(gè)被觀察者傳遞。參考的文章:
- Window
- Introduction to Rx: GroupBy
- Animations of Rx operators: GroupBy by Tamir Dresher
-
Map — 通過使用一個(gè)函數(shù)來改變被觀察者產(chǎn)生的事件寄摆。
Map.pngmap()
操作符對每個(gè)原始事件使用指定的函數(shù)谅辣,并且返回一個(gè)用這些函數(shù)結(jié)果產(chǎn)生事件的被觀察者。參考的文章:
- FlatMap
- Introduction to Rx: Select
- RxMarbles:
map
- 101 Rx Samples: Select — Indexed
- Using the map method with Observable by Jafar Husain (JavaScript視頻教程)
-
FlatMap — 將被觀察者產(chǎn)生的每個(gè)事件轉(zhuǎn)換成被觀察者婶恼,然后將它們產(chǎn)生的所有事件由統(tǒng)一的被觀察者傳遞桑阶。
FlatMap.pngflatmap()
操作符使用一個(gè)指定的函數(shù)來處理每個(gè)原始事件,從而改變被觀察者勾邦。與map()
操作符不同的是蚣录,它的函數(shù)返回一個(gè)自己能夠產(chǎn)生事件的被觀察者。然后眷篇,該操作符混合所有后生成的被觀察者產(chǎn)生的事件萎河,作為自己的事件隊(duì)列傳遞出去。這個(gè)方法是有用的蕉饼,例如虐杯,當(dāng)一個(gè)被觀察者產(chǎn)生一系列事件,這些事件本身擁有被觀察者成員或通過其它方式轉(zhuǎn)變成被觀察者昧港,所以會創(chuàng)建新的被觀察者來傳遞它們產(chǎn)生的所有事件的集合擎椰。需注意的是,
flatmap()
操作符混合了那些被觀察者的事件创肥,所以事件在順序上可能會交錯(cuò)达舒。在幾個(gè)特定語言的實(shí)現(xiàn)中值朋,擁有不會導(dǎo)致交錯(cuò)問題的操作符,而是按照嚴(yán)格的順序傳遞這些事件休弃,通常稱為
concatMap()
之類的吞歼。參考的文章:
- Map
- Grokking RxJava: Operator, Operator by Dan Lew
- Introduction to Rx: SelectMany
- Recursive Observables with RxJava by Jon Schneider
- RxJava Observable transformation: concatMap() vs. flatMap() by Fernando Cejas
-
Scan — 給被觀察者產(chǎn)生的每個(gè)事件應(yīng)用函數(shù),處理時(shí)可使用前一個(gè)值作為參數(shù)塔猾。
Scan.pngscan()
操作符使用函數(shù)處理第一個(gè)原始事件篙骡,然后將函數(shù)的結(jié)果作為自己的第一個(gè)事件傳遞出去。同時(shí)也將函數(shù)的結(jié)果反饋給函數(shù)處理中的第二個(gè)原始事件丈甸,從而生成自己的第二個(gè)事件糯俗,并依此規(guī)則創(chuàng)建自己剩余的事件隊(duì)列。在其它上下文中睦擂,這種操作符有時(shí)被稱為累加器得湘。參考的文章:
5.過濾被觀察者
選擇性地傳遞原始事件的操作符。
-
Sample — 傳遞被觀察者在周期時(shí)間間隔內(nèi)最近產(chǎn)生的事件顿仇。
Sample.pngsample()
操作符周期性地查看被觀察者淘正,且傳遞任何一個(gè)從上次采樣后最近產(chǎn)生的事件。在某些實(shí)現(xiàn)中臼闻,還有相似的throttleFirst()
操作符鸿吆,但不是傳遞取樣事件內(nèi)最近產(chǎn)生的事件,而是那個(gè)時(shí)間內(nèi)最初創(chuàng)建的事件述呐。參考的文章:
-
Debounce — 只傳遞被觀察者在特定時(shí)間內(nèi)僅產(chǎn)生了一個(gè)的事件(沒產(chǎn)生另一個(gè))惩淳。
Debounce.pngdebounce()
操作符從原始事件中過濾出那些被另一個(gè)事件緊密追隨的事件。參考的文章:
-
Distinct — 不傳遞被觀察者產(chǎn)生的重復(fù)事件乓搬。
Distinct.pngdistinct()
操作符只允許被觀察者之前沒有產(chǎn)生過的事件通過思犁。在某些實(shí)現(xiàn)中會有不同,允許調(diào)整區(qū)別兩個(gè)事件的標(biāo)準(zhǔn)进肯;或僅比較相鄰兩項(xiàng)的區(qū)別激蹲,從而只過濾事件隊(duì)列中連續(xù)重復(fù)的。參考的文章:
-
Filter — 只傳遞被觀察者那些通過判斷檢驗(yàn)的事件江掩。
Filter.pngfilter()
操作符只允許被觀察者符合指定的判斷函數(shù)檢驗(yàn)的事件通過托呕。參考的文章:
-
Take — 只傳遞被觀察者產(chǎn)生的最初的n個(gè)事件。
Take.png通過
take()
操作符修改被觀察者频敛,使只傳遞被觀察者產(chǎn)生的最初的n個(gè)事件项郊,然后完成時(shí)忽略剩下的。參考的文章:
-
TakeLast — 只傳遞被觀察者產(chǎn)生的最終的n個(gè)事件斟赚。
TakeLast.png通過
takeLast()
操作符修改被觀察者着降,使只傳遞被觀察者產(chǎn)生的最終的n個(gè)事件,然后忽略之前的那些事件拗军。參考的文章:
-
Skip — 不傳遞被觀察者產(chǎn)生的最初的n個(gè)事件任洞。
Skip.png通過
skip()
操作符修改被觀察者蓄喇,使忽略被觀察者產(chǎn)生的最初的n個(gè)事件,然后只關(guān)注后面的那些事件交掏。參考的文章:
-
SkipLast — 不傳遞被觀察者產(chǎn)生的最終的n個(gè)事件妆偏。
SkipLast.png通過
skipLast()
操作符修改被觀察者,使忽略被觀察者產(chǎn)生的最終的n個(gè)事件盅弛,然后只關(guān)注之前的那些事件钱骂。參考的文章:
-
ElementAt — 只傳遞被觀察者產(chǎn)生的第n個(gè)事件。
ElementAt.pngelementAt()
操作符獲取原始事件隊(duì)列中一個(gè)特定位置的事件挪鹏,作為自己單一的事件產(chǎn)生见秽。參考的文章:
-
First — 只傳遞被觀察者產(chǎn)生的第一個(gè)事件,或符合某條件的第一個(gè)事件讨盒。
First.png如果僅關(guān)注被觀察者產(chǎn)生的第一個(gè)事件解取,或者滿足一定條件的第一個(gè)事件,可以通過
first()
操作符過濾返顺。在某些實(shí)現(xiàn)中禀苦,
first()
操作符不是作為過濾操作符實(shí)現(xiàn)的,而是當(dāng)原始被觀察者產(chǎn)生某事件時(shí)遂鹊,作為阻塞函數(shù)返回該事件振乏。若反而想要過濾操作,可能需使用Take(1)
或ElementAt(0)
稿辙。還有single()
操作符,它的行為與first()
操作符類似气忠,除了會一直等到原始被觀察者終止來保證只產(chǎn)生單一事件(否則邻储,直接發(fā)onError()
通知終止,而不是傳遞事件)旧噪。它不僅能獲取第一個(gè)原始事件吨娜,而且保證只有一個(gè)事件。參考的文章:
- ElementAt
- Last
- Take
- Introduction to Rx: First
- Introduction to Rx: Single
- Loading data from multiple sources with RxJava by Dan Lew (example using Concat and First)
- RxMarbles:
find
- RxMarbles:
findIndex
- RxMarbles:
first
-
Last — 只傳遞被觀察者產(chǎn)生的最后的事件淘钟,或符合某條件的最后的事件宦赠。
Last.png如果僅關(guān)注被觀察者產(chǎn)生的最后的事件,或者滿足一定條件的最后的事件米母,可以通過
last()
操作符過濾勾扭。在某些實(shí)現(xiàn)中,last()
操作符不是作為過濾操作符實(shí)現(xiàn)的铁瞒,而是當(dāng)原始被觀察者終止時(shí)妙色,作為阻塞函數(shù)返回特定的事件。若反而想要過濾操作慧耍,可能需使用TakeLast(1)
身辨。參考的文章:
-
IgnoreElements — 不傳遞被觀察者的任何事件丐谋,除了它的終止通知。
IgnoreElements.pngignoreElements()
操作符禁止所有原始事件煌珊,除了原始被觀察者的終止通知(onError()
或onCompleted()
)能直接通過号俐。如果不關(guān)心被觀察者產(chǎn)生的事件,只想關(guān)注它什么時(shí)候結(jié)束或被錯(cuò)誤終止定庵,可以對被觀察者使用這個(gè)操作符吏饿,將確保不會調(diào)用它的觀察者的onNext()
處理。參考的文章:
6.合并被觀察者
通過多個(gè)原始被觀察者創(chuàng)建單一的被觀察者的操作符洗贰。
-
And / Then / When — 通過Pattern和Plan的轉(zhuǎn)換找岖,合并兩個(gè)或多個(gè)被觀察者產(chǎn)生的事件集合。
And / Then / When.pngand()
敛滋、then()
和when()
操作符合并的行為非常類似于zip()
操作符许布,但它們是通過中間層的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的。首先接收兩個(gè)或多個(gè)被觀察者绎晃,每次分別取出一個(gè)事件組成集合放入Pattern對象蜜唾。接著將這些Pattern對象分別轉(zhuǎn)換成Plan對象,再依次將各種Plan對象轉(zhuǎn)換成被觀察者的事件庶艾。參考的文章:
-
Zip — 通過指定的函數(shù)將多個(gè)被觀察者的事件合并在一起袁余,并把結(jié)果作為每種組合的單一事件產(chǎn)生。
Zip.pngzip()
操作符返回一個(gè)被觀察者咱揍,它是由指定的函數(shù)依次合并兩個(gè)或多個(gè)其它被觀察者產(chǎn)生的事件颖榜,并將結(jié)果作為自己產(chǎn)生的事件。函數(shù)的使用有嚴(yán)格的順序煤裙,新的被觀察者產(chǎn)生的第一個(gè)事件是函數(shù)將作用的被觀察者產(chǎn)生的第一個(gè)事件合并的結(jié)果掩完,其它以此類推,并且產(chǎn)生事件的數(shù)量由原始事件中最少的那列決定硼砰。參考的文章:
-
CombineLatest — 當(dāng)兩個(gè)被觀察者中任一個(gè)產(chǎn)生一個(gè)事件且蓬,通過指定函數(shù)合并每個(gè)被觀察者產(chǎn)生的最新事件,并將結(jié)果作為事件產(chǎn)生题翰。
CombineLatest.pngcombineLatest()
操作符的行為與zip()
操作符相似恶阴。除了后者要求每個(gè)需要壓縮的原始被觀察者產(chǎn)生的事件沒被壓縮過;前者則不管這些豹障,只要每個(gè)原始被觀察者產(chǎn)生至少一個(gè)事件冯事。當(dāng)任一個(gè)原始被觀察者產(chǎn)生一個(gè)事件,前者使用提供的函數(shù)合并其它原始被觀察者最近產(chǎn)生的事件血公,并將返回值作為事件產(chǎn)生桅咆。參考的文章:
-
Join — 在被觀察者產(chǎn)生的一個(gè)事件的時(shí)間窗內(nèi),其它被觀察者也產(chǎn)生了事件坞笙,則合并兩個(gè)被觀察者相應(yīng)的事件岩饼。
Join.pngjoin()
操作符合并兩個(gè)被觀察者產(chǎn)生的事件荚虚,并根據(jù)已經(jīng)定義的事件的時(shí)間窗決定哪些需要合并。當(dāng)這樣一個(gè)定義了時(shí)間窗的被觀察者產(chǎn)生新事件或onCompleted()
通知時(shí)籍茧,之前的時(shí)間窗將關(guān)閉版述。只要一個(gè)事件的時(shí)間窗是開啟的,它將合并其它被觀察者產(chǎn)生的任一事件寞冯。還需定義事件合并的函數(shù)渴析。GroupJoin.png大多數(shù)ReactiveX的實(shí)現(xiàn)中,不僅有
join()
操作符還有相似的groupJoin()
操作符吮龄。除了定義用來合并兩個(gè)被觀察者產(chǎn)生的事件的函數(shù)有所改變俭茧,即后一個(gè)參數(shù)由第二個(gè)被觀察者的符合條件的事件替換為產(chǎn)生相應(yīng)符合事件的被觀察者(可以將前一個(gè)參數(shù)理解為鍵,后一個(gè)參數(shù)理解為對應(yīng)的所有的值)漓帚。參考的文章:
-
Merge — 通過直接合并事件來合并多個(gè)被觀察者母债。
Merge.pngmerge()
操作符能夠合并多個(gè)被觀察者的事件,使它們看起來像單一被觀察者尝抖。它可能會交錯(cuò)合并的被觀察者產(chǎn)生的事件(一個(gè)類似的操作符concat()
毡们,則沒有這個(gè)問題,在下個(gè)原始被觀察者開始產(chǎn)生事件之前會依次傳遞當(dāng)前的被觀察者的事件)昧辽。如上圖所示衙熔,任一個(gè)原始被觀察者發(fā)出
onError()
通知,將會立即傳遞給觀察者搅荞,并且會終止合并的被觀察者红氯。MergeDelayError在許多ReactiveX的實(shí)現(xiàn)中,還有一個(gè)操作符
mergeDelayError()
咕痛,改變了這種行為——推遲onError()
通知直到所有合并的被觀察者完成才傳給觀察者痢甘。參考的文章:
-
StartWith — 在開始傳遞原始事件之前,傳遞指定的事件隊(duì)列暇检。
StartWith.png如果想要被觀察者在開始傳遞期望的事件之前产阱,傳遞指定的事件隊(duì)列婉称,可以使用
startWith()
操作符块仆。(相反,如果想要在被觀察者傳遞期望的事件之后添加事件隊(duì)列王暗,可以使用concat()
操作符悔据。)參考的文章:
-
Switch — 將一個(gè)以被觀察者為事件的被觀察者轉(zhuǎn)換為單一被觀察者,若那些事件級被觀察者同時(shí)間段內(nèi)產(chǎn)生了事件俗壹,取最近的被觀察者的事件作為自己事件產(chǎn)生科汗。
Switch.pngswitch()
操作符關(guān)注的是以被觀察者為事件的被觀察者。每次它只面對這些事件級被觀察者中的一個(gè)绷雏,并在最新的被觀察者開始產(chǎn)生事件時(shí)头滔,轉(zhuǎn)而傳遞這些新事件怖亭。注意,前一個(gè)被觀察者在后一個(gè)被觀察者開始產(chǎn)生事件之后(包括僅是被訂閱還未發(fā)送事件)產(chǎn)生的事件將丟棄(如上圖中的黃色圓圈)坤检。參考的文章:
7.錯(cuò)誤處理操作符
幫助從被觀察者的onError()
通知中恢復(fù)的操作符兴猩。
-
Catch — 通過攔截隊(duì)列中的一個(gè)
onError()
通知,來保證繼續(xù)執(zhí)行早歇。Catch.pngcatch()
操作符攔截原始被觀察者產(chǎn)生的一個(gè)onError()
通知倾芝,而不是將它傳遞給任一觀察者,同時(shí)可以用一些其它事件或事件隊(duì)列替換箭跳,還可以允許被觀察者正常終止或根本不終止晨另。還有幾種catch()
操作符,以及在不同的ReactiveX實(shí)現(xiàn)中用不同的名字描述這個(gè)操作谱姓,正如下面部分看到的借尿。在一些ReactiveX實(shí)現(xiàn)中,有一個(gè)操作符叫什么
onErrorResumeNext()
逝段,行為類似catch()
操作符:對原始被觀察者產(chǎn)生的一個(gè)onError()
通知有特定反應(yīng)垛玻。還有一個(gè)同樣名字的操作符,行為更像concat()
操作符:不管原始被觀察者是正常終止還是錯(cuò)誤終止奶躯,執(zhí)行連接操作帚桩。參考的文章:
-
Retry — 如果原始被觀察者發(fā)送一個(gè)
onError()
通知,將重新訂閱以期望下次沒有錯(cuò)誤地完成嘹黔。Retry.pngretry()
操作符通過不傳遞onError()
通知給觀察者账嚎,來響應(yīng)原始被觀察者發(fā)生的錯(cuò)誤,并重新訂閱它儡蔓,獲得另一次無錯(cuò)誤地完成自己的事件隊(duì)列的機(jī)會郭蕉。這個(gè)操作符先傳遞onNext()
通知給自己的觀察者,即使隊(duì)列是因?yàn)殄e(cuò)誤而終止的喂江,所以會導(dǎo)致重復(fù)的事件(如上圖所示)召锈。參考的文章:
8.總結(jié)
到目前為止,已經(jīng)介紹了ReactiveX一半的操作符获询,而這些操作符恰恰也是最常用的涨岁。ReactiveX可以理解為設(shè)計(jì)模式,講的是一種思路吉嚣,具體每種語言的實(shí)現(xiàn)是不同的梢薪。對于Android開發(fā)的同學(xué),肯定希望使用RxJava尝哆,這里推薦幾篇我認(rèn)為比較全的文章秉撇,以供參考: