【程序系列翻譯】ReactiveX

【程序系列翻譯】ReactiveX - Observable

ReactiveX系列

ReactiveX 是http://reactivex.io提供的響應式框架,採用觀察者模式+鏈式api構成,目前支持語言如下:

【程序系列翻譯】ReactiveX - Observable

ReactiveX系列翻譯,僅翻譯通用篇,共計5篇內容:

  1. Observable
  2. Operators
  3. Single
  4. Subject
  5. Scheduler

只有理解了這五大內容,學習起來才會有目標和場景。以後不管你去使用RxJava,還是RxSwift,中心思想不會跳出這些內容。

本文是第一篇:可觀察

簡述了可觀察的內容是什麼,以及觀察者模式中的流程

正文

在ReactiveX中,一個觀察者對象訂閱在可觀察對象。然後,可觀察對象發出任何的項目或者項目序列,觀察者對象都會做出響應。因為在等待

可觀察對象發出消息的時候不會阻塞當前任何操作,所以這個模式適合併發操作,且觀察者對象會創建一個類似哨兵的監聽,隨時對可觀察對象所做的任何事情做出相應。

本文解釋了反應模式是什麼以及Observables和觀察者是什麼(觀察者如何訂閱Observables)。

下面這張圖很直觀的說明了反應模式,如何表示Observables的Observables和轉換:

【程序系列翻譯】ReactiveX - Observable


後臺支持

在你編寫程序的任務時,你或多或少希望你的任務是逐漸遞增的,同一時間僅執行一個。但是在ReactiveX中,許多任務是可以並行的,他們沒有任何執行順序,而是通過觀察者獲取結果而不是一個方法。您定義了一種檢索和轉換數據的機制,以“Observable”的形式,然後訂閱觀察者。此時,先前定義的機制開始發揮作用,觀察員站在崗哨,以便在準備就緒時捕獲並響應其排放。

這種方法的一個優點是,當你有一堆不依賴於彼此的任務時,你可以同時啟動所有任務,而不是等到每個任務完成後再開始下一個。這樣,你的整個捆綁任務只需要與捆綁中最長的任務一樣長。

有許多術語用於描述這種異步編程和設計模型。本文將使用以下術語:觀察者訂閱Observable。Observable通過調用觀察者的方法發出項目或向其觀察者發送通知。

在其他文件和其他背景下,我們所謂的“觀察者”有時被稱為“用戶”,“觀察者”或“反應堆”。這種模型通常被稱為“反應堆模式”。

示例:建立觀察者

此頁面使用類似Groovy的偽代碼作為示例,但在許多語言中都有ReactiveX實現。

在普通的方法調用中 - 也就是說,不是ReactiveX中典型的異步並行調用 - 流程就是這樣的:

  1. 調用一個方法
  2. 將該方法的返回值存儲在變量中
  3. 使用該變量及其新值來做一些有用的事情

比如:

【程序系列翻譯】ReactiveX - Observable

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

  1. 定義一個方法,該方法對異步調用的返回值執行一些有用的操作;這種方法是觀察者的一部分
  2. 將異步調用本身定義為Observable
  3. 通過訂閱將觀察者附加到該Observable(這也啟動了Observable的操作)
  4. 繼續你的事業,每當調用返回時,觀察者的方法將開始對其返回值或值進行操作 - Observable發出的結果

比如:

【程序系列翻譯】ReactiveX - Observable

onNext, onCompleted, onError

這是3個訂閱反饋方法。Subscribe方法是將觀察者連接到Observable的方法。

  • onNext:只要Observable發出一個項目,Observable就會調用此方法。此方法將Observable發出的項作為參數
  • onError:Observable調用此方法以指示它無法生成預期數據或遇到其他一些錯誤。它不會進一步調用onNext或onCompleted。onError方法將參數指示導致錯誤的原因。
  • onCompleted:如果Observable在最後一次調用onNext,如果它沒有遇到任何錯誤,則調用此方法

按照Observable的接口規範,onNext可以調用任意次數(包括0次),在最後一次調用(結束的時候),onCompleted及onError僅可調用其一。按照文檔的定義,我們將onNext稱作“排放”,onCompleted及onError的調用稱作“通知”。

更完整的訂閱調用示例如下所示:

【程序系列翻譯】ReactiveX - Observable

退訂

在很多語言實現中,存在一個特殊的觀察者接口Subscriber,他實現了unsubscribe方法。你可以調用這個方法來指示訂閱服務器不再對它當前訂閱的任何Observable感興趣。那些Observable可以(如果他們沒有其他感興趣的觀察者)選擇停止生成要發出的新項目。

此取消訂閱的結果將通過適用於觀察者訂閱的Observable的運算符鏈級聯回來,這將導致鏈中的每個鏈接停止發射項目,這不能保證立即發生,然而,即使在沒有觀察者觀察這些排放之後,Observable也有可能產生並嘗試發射物品一段時間。

命名約束

每種語言實現ReactiveX,都有自己的命名喜好。雖然實現之間存在許多共性,但沒有規範的命名標準。

此外,其中一些名稱在其他情況下具有不同的含義,或者在特定實現語言的習語中看起來很尷尬。

比如,onEvent命名(通用: onNext, onCompleted, onError

)。在某些上下文中,這些名稱將指示通過哪些方法註冊事件處理程序。但是,在ReactiveX中,它們自己命名事件處理程序。

“熱”和“冷”觀察者

Observable何時開始發出任務序列?這取決於Observable。

“熱”Observable可以在創建項目後立即開始發出項目,因此任何後來訂閱該Observable的觀察者都可以開始在中間某處觀察序列。

另一方面,“冷”Observable等待觀察者在開始發射物品之前訂閱它,因此這樣的觀察者保證從一開始就看到整個序列。

在ReactiveX的一些實現中,還存在稱為“可連接”可觀察的東西。

這樣的Observable在調用Connect方法之前不會開始發出項目,無論是否有任何觀察者都訂閱了它。

Observable運算符

Observable和觀察者只是ReactiveX的開始。它們本身只不過是標準觀察者模式的輕微擴展,更適合處理一系列事件而不是單個回調。

真正的力量來自“反應式擴展”(因此是“ReactiveX”) - 允許您轉換,組合,操作和處理Observables發出的項目序列的運算符。

這些Rx運算符允許您以聲明方式組合異步序列,同時具有回調的所有效率優勢,但沒有嵌套回調處理程序的缺點,這些回調處理程序通常與異步系統相關聯。

ReactiveX包含的運算符如下:

  • 創建Observable:
  • 轉換Observable項:
  • 過濾Observable:
  • 合併Observable:
  • 錯誤處理:
  • 公用工具:
  • 條件和布爾:
  • 數學和集合:
  • 轉化Observable:
  • 連接Observable:
  • 背壓:

這些運算符不屬於ReactiveX的核心,而是在一個或多個特定於語言的實現和/或可選模塊中實現的。

鏈式調用

大多數運算符都在Observable上運行並返回一個Observable。這允許您在鏈中一個接一個地應用這些運算符。鏈中的每個運算符都會修改由前一個運算符的運算產生的Observable。

當然,還有其他模式,如Builder模式,其中特定類的各種方法通過方法的操作修改該對象,對同一類的項進行操作。這些模式還允許您以類似的方式鏈接方法。但是在Builder模式中,方法在鏈中出現的順序通常並不重要,Observable運算符命令事項。

鏈式Observable運算符不能在原始的Observable上獨立運行,它發起鏈,但它們依次運行,每個運算符都由運算符在鏈中的前一個運算符生成。


分享到:


相關文章: