ReactiveX
ReactiveX 是一個基于一系列可觀察的異步和基礎(chǔ)事件編程組成的一個庫。
它繼承觀察者模式,支持序列數(shù)據(jù)或者事件。更高級的用法允許你將如下的一些抽象概念操作一起聯(lián)合使用,比如低線程肩袍,同步,線程安全婚惫,數(shù)據(jù)并發(fā)氛赐,非阻塞I/O流。
它通常被稱為“函數(shù)響應(yīng)式編程”先舷,這是用詞不當(dāng)?shù)募韫堋eactiveX 可以是函數(shù)式的,可以是響應(yīng)式的蒋川,但是和“函數(shù)響應(yīng)式編程”是不同的概覽蛙婴。一個主要的不同點(diǎn)是“函數(shù)響應(yīng)式編程”是對隨著時間不停變化的值進(jìn)行操作的,而ReactiveX是對超時提交產(chǎn)生的離散值上尔破。
為什么使用Observables街图?
ReactiveX 可見模式允許你使用數(shù)組等數(shù)據(jù)項(xiàng)的集合來進(jìn)行些異步事件流組合操作。它使你從繁瑣的web式回調(diào)中解脫懒构,從而能使得代碼可讀性大大提高餐济,同時減少bug的產(chǎn)生。
Observables是可以進(jìn)行一系列組合的
它技術(shù)上和Java Futures一樣簡單是直接當(dāng)著一個異步執(zhí)行使用的胆剧,但是當(dāng)Futures被嵌套使用復(fù)雜度會大大增加絮姆。
很難直接使用Futures去優(yōu)化條件異步執(zhí)行流程。然而Observables可以秩霍。使用Future.get()馬上使其變得復(fù)雜或者提前進(jìn)入阻塞狀態(tài)篙悯,使的異步執(zhí)行的優(yōu)點(diǎn)淡然無存。
ReactiveX Observables 是為了處理組合流和異步序列數(shù)據(jù)設(shè)計(jì)的铃绒。
Observables 數(shù)據(jù)是靈活的
ReactiveX Observables不單單支持單個標(biāo)量的值(想Futures)的提交,同時還支持多值甚至是很多的數(shù)據(jù)流鸽照。Observables是一個單個抽像,能被用到一些用戶場景中颠悬。Observable和Iterable一樣運(yùn)用靈活并且可以進(jìn)行更加高雅的操作矮燎。
event ? ? ? ? ? ? ? ? ? ? ? ? ? ?Iterable (pull) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Observable (push)
retrieve data ? ? ? ? ? ? ? ? T next() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?onNext(T)
discover error ? ? ? ? ? ? throwsExceptionon ? ? ? ? ? ? ? ? ? ? ? ? Error(Exception)
complete ? ? ? ? ? ? ? ? ? ?!hasNext() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? onCompleted()
Observables 是類型多變
并發(fā)、異步資源可以應(yīng)用在ReactiveX中赔癌,Reactiviex可以當(dāng)著一個線程池使用诞外,甚至loops,非阻塞I/O線程使用灾票,無論什么能夠更好符合你的需要峡谊,風(fēng)格、專長刊苍〖让牵客戶端代碼處理交互使用Observables進(jìn)行異步處理,無論你潛在的操作是阻塞或者非阻塞都可以選擇它來實(shí)現(xiàn)班缰。
?Observable 如何執(zhí)行呢?
public Observable getData();
.作為調(diào)用者是否異步運(yùn)行在同一個線程中?
.是否異步運(yùn)行在不同的線程中?
.是否被劃分在多種線程中并且順序返回?cái)?shù)據(jù)對于調(diào)用者?
.是否使用 Actor (or multiple Actors) 代替線程池?
.是否使用網(wǎng)絡(luò)NIO(網(wǎng)絡(luò)接口對象)通過loop異步進(jìn)行網(wǎng)絡(luò)異步訪問贤壁?
.使用使用loop 來將工作線程從回調(diào)線程中剝離開?
回調(diào)函數(shù)存在問題
回調(diào)函數(shù)為了解決 Future.get()過早的阻塞問題是通過不允許執(zhí)行任何阻塞的行為埠忘。這能處理很好因?yàn)閳?zhí)行的時候響應(yīng)數(shù)據(jù)已經(jīng)就緒了脾拆。
未來,回調(diào)函數(shù)能夠簡單通過單個級別的異步執(zhí)行莹妒,然而通過嵌套就顯得不靈活名船。
ReactiveX 是跨語言的
ReactiveX 當(dāng)前被多種編程語言實(shí)現(xiàn),它遵守各種語言慣用語旨怠,同時多種語言正在加入其中渠驼。
交互式編程
ReactiveX 提供操作符集合,你可以使用 filter, select, transform, combine, and compose Observables鉴腻。這將形成有效執(zhí)行和結(jié)構(gòu)迷扇。
你可以將Observable類的“push”行為等價(jià)于iterable的“pull”百揭。使用Iterable消費(fèi)者拉取數(shù)據(jù)從生產(chǎn)者此時線程阻塞直到數(shù)據(jù)到達(dá)。相比之下Observable生產(chǎn)者上傳數(shù)據(jù)給消費(fèi)者無論何時只要數(shù)據(jù)可用蜓席。這個方式是非常靈活的器一,因?yàn)閿?shù)據(jù)到達(dá)可以使用同步或者異步的方式。
Demo Iterator/Observable 相似處
Observable 類型 相對于the Gang of Four’s Observer pattern增加了2個缺失的語法厨内,去匹配可用的Iterable 類型祈秕。
? ? ? ?1.當(dāng)前沒有跟多可用數(shù)據(jù)時候生產(chǎn)者通知消費(fèi)者的能力(onCompleted方法)
? ? ? ?2.當(dāng)前發(fā)生錯誤的時候生產(chǎn)者通知消費(fèi)者的能力(onErro方法)
通過以上這些,ReactiveX使得Iterable和Observable類型一致雏胃。唯一的不同是數(shù)據(jù)流動的方向请毛。這是非常重要的因?yàn)楝F(xiàn)在你在Iterable上面的一系列操作同樣可以用Oberservable達(dá)到效果。