Observable約定

英文地址:The Observable Contract

響應式的Observable約定

Observable約定,你可能在多個地方的源碼文檔中看到了這個引用,本網頁試圖給出Observable的一個正式定義,基於微軟2010 Rx Design Guidelines 的文檔,這個文檔描述了他們如何在Rx.NET實現ReactiveX。
本網頁總結Observable約定。

消息

Observable和觀察者通信有如下消息:

OnNext

協載Observable彈出的數據項到觀察者

OnCompleted

表示Observable 已經成功完成,並且不再發送任何數據

OnError

表示Observable因特定的錯誤條件而終止,並且不再發送任何數據

OnSubscribe (可選)

表示Observable已經準備好接收觀察者的請求消息(看下面的背壓)

觀察者和Observable通信方式有如下消息:

Subscribe

表示觀察者已經準備好接收Observable消息。

Unsubscribe

表示觀察者不再想要接收Observable消息

Request (可選)

表示觀察者向Observable請求更多 OnNext 消息,請求的數量有限制(看下面的背壓)。

管理消息約定

Observable 可能製造0到多個消息,每一個消息代表一個發出的數據項,並且後面可能跟隨其中之一的OnCompleted 或者 OnError 消息,在發佈 OnCompleted 或者OnError消息之後不會發布任何其他消息。
Observable可能不發佈任何數據項。Observable可能永遠不會以onCompleted 或者OnError消息來結束。那就是說只發布其中之一的OnCompleted 或者 OnError 消息,或者只發布OnNext 消息,消息對於不發佈消息的 Observable是可以的。
Observable必須順序的給觀察者發佈消息(不是並行)。Observable可能重不同的線程發佈消息,但是消息必須是以“之前發生”形式關係。

Observable終結

如果一個沒有發佈OnCompleted 或者 OnError 消息的Observable,可以認爲他還是活着的(即便是他沒有當前沒有發佈數據項)和可能發佈消息(比如Unsubscribe 和Request 消息)。當Observable發佈 OnCompleted 或者 OnError 消息,那麼他將釋放他的資源並結束,他的觀察者應當不再嘗試和他通信。

一個OnError 消息必須保含錯誤原因(就是說,帶null值調用OnError是不合法的)。
當一個Observable 結束前,他必鬚髮布OnCompleted 或者 OnError 消息給訂閱他的所有觀察者。

訂閱和取消訂閱

Observable接收到觀察者的訂閱消息後會立即開始發佈消息.
當觀察者發佈取消訂閱消息給 Observable ,Observable會嘗試停止發佈消息給觀察者。這些是沒有確保的,但是在觀察者發送取消訂閱消息給Observable後,Observable將不會再發送消息給觀察者
當Observable發佈OnCompleted 或者 OnError消息給觀察者時,就已經結束了訂閱。通過這種方式觀察者不需要發佈取消訂閱消息來結束訂閱。

多觀察者

如果第二個觀察者訂閱到已經發布數據項到第一個觀察者的 Observable,沒有普遍的規定同一個Observale的2個觀察者將接收相同序列的數據項,他取決於Observalbe是否此時開始發佈相同的數據項給觀察者,或者 Observable 重新發布已經發布給第一個觀察者的數據項,或者發送完全不同的數據項給第二個觀察者。

背壓

背壓是一個可選項,不是所有的響應式實現都包含背壓,而且在那些實現的背壓的相應式,不是所有的Observable和操作都尊重背壓。如果Observable發現他的觀察者實現了請求消息並理解接觸訂閱消息,那麼Observable可能實現了背壓。

如果Observable實現了背壓並且他的觀察者啓用了背壓,當觀察者註冊後Observable不會立即發佈數據,相應的他將發佈OnSubscribe 消息給觀察者。

在接收OnSubscribe消息後,觀察者任何時候都可能發佈Request消息給Observable 。Request 消息必須包含請求數據量的大小。Observable彈出不多於觀察者請求數量大小的數據來相應請求。然而 Observable 可能額外發布OnCompleted 或者 OnError 消息,甚至可能在觀察者沒有請求任何數據項前發佈這些消息。

一個沒有實現背壓的Observable應該通過發佈 OnError 消息來響應觀察者的Request 消息,表示他不支持背壓。

請求是累計的。例如,觀察者發佈了請求數目分別爲3,5,10的三個請求,Observable會發送18個數據項給觀察者,不管這些請求消息到達的對於Observable彈出的數據項相對的時間。

如果Observable生產的數據多於觀察者請求的數目,這取決於Observable是否丟棄,存儲,或者延後發送這些超額的數據,或者使用其他策略來處理這些溢出數據。

參考文檔

後記

當我第一次看到這篇英文文檔後,他解決了我很多的疑問。比如,我們在Java中調用observer,subscripe等方法時,我並不是非常理解這個方法的含義,另外他給我描述了背壓的概念,解釋了請求(Request)的含義。而英文原頁面沒有中文翻譯,所以我就很想將他翻譯,讓後給到這個網站,方便中國讀者理解ReactiveX技術。由於本人英語水平有限,文章翻譯有不確切的地方,望大家不惜時間給予糾正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章