Observable規範(Observable Contract):
http://reactivex.io/documentation/contract.html
“The Observable Contract”, 在ReactiveX的官方文檔,網站以及源碼註釋上經常出現。是基於微軟在2010發表的 Rx Design Guidelines(用於描述Rx.Net是如何實現ReactiveX的),對Observable機制進行的規範化嘗試。下文基本是全文翻譯,稍微插一點我自己的理解。
注: 下面描述的 “通信”, “發出”, “收到”, “Notification” 等不代表傳統意義上的信息收發,而是在抽象層面的描述,在實現層面可以理解爲一個對象調用另外一個對象的方法。
注: “Item”代表Observable向observer發送的一條信息(OnNext/OnError/OnCompleted)。
注: “Subscription” 是對observer subscribe Observable這一訂閱關係的表述。
Notifications, 代表抽象概念上,對象之間通信的“信息”。
- Observable向observer發送的Notification:
- OnNext: 表示Observable向observer發送了一條信息。
- OnCompleted: 表示Observable圓滿結束髮送任務,不會再發送信息。
- OnError: 表示Observable因爲某個錯誤被終止,不會再發送信息。
- OnSubscribe (可選): 表明Observable開始準備接收來自observer的Request notifications(見下面的Backpressure介紹)
- observer可以向Observable發送下列Notification進行通信:
- Subscribe:表示observer開始接收來自Observable的notifications.
- Unsubscribe: 表示observer不再接收來自Observable的notifications.
- Request (可選): 表示observer向Observable請求不多於一定數量的附加性onNext notification.(見下面的Backpressure介紹)
- Observable向observer發送的Notification:
Notifications準則:
- Observable可以發出>=0個OnNext, 每次代表一個獨立的item發出。
- 發送序列最後接一個*OnCompleted或OnError, 但是兩者是互斥出現*的。
- 一旦發出了OnCompleted或者OnError, 後續不再發送任何Notification。
- 允許Observale**不發出任何Notification**。
- 允許Observable永遠不發出OnCompleted或OnError, 永不結束。
- Observable可以自始至終只發一個OnCompleted或OnError。
- 注: 上述對Observable的特殊情況描述在RxJava中都有對應的Observable擴展類。
- Observable必須線性的向observers發送Notification, 禁止並行發送。比如,來自不同線程的Notification, 在投遞時,Notification之間必須有明確的可以界定的先後關係(比如兩個線程T1, T2都會調OnNext, 那麼T1和T2調OnNext的過程中不能產生交織,比如T1先執行OnNext,在執行過程中,即使切換到了T2,T2也需要等待T1的OnNext完整執行以後才能執行自己的OnNext,其實描述的並不精確,只是爲了好理解)。
Observable結束:
- 只要Observable沒有發出OnCompleted或OnError, 從observer角度看,這個Observable仍然是“活”的(即使它現在並沒有發送Notification),可以繼續和該Observable進行通信(比如Unsubscribe或Request)。
- Observable發出OnCompleted或OnError代表Observable的結束,不能再通信。
- OnError必須攜帶錯誤的原因描述(這意味着OnError回傳null是非法的)。
- Observable結束前必須保證向其observers發送了OnCompleted/OnError。
訂閱(Subscribing)和註銷(Unsubscribing):
- Observable在收到observer的Subscribe後就可以立即向observer發送Notification.
- observer 向Observable發出Unsubscribe後, Observable會嘗試停止向observer發送Notification。但是不保證Observable不會再向observer發送Notification(注:因此observer需要自己處理這種情況)
- Observable發送OnError/OnCompleted**代表着Subscription的結束**。這種情況下,observer不需要再向Observable發送UnSubscribe來結束Subscription。
多重Observer
- 假設有兩個observer A, B. A先subscribe了Observable,Observable發送了複數個Notification給A,然後B subscribe了 Observable。
- 在B subscribe 時,取決於Observable的具體策略或者實現,可能有如下的行爲:
- Observable在下一次發送Notification時同時發給A和B。
- Observable將B subscribe之前發出的Notification replay給B。
- Observable會向B發送次序不同於A的Notification序列。
- 等等其他。
- 不保證subscribe同一個Observable的複數個observer可以收到相同次序的Notification序列
Backpressure(背壓: refers to pressure opposed to the desired flow of gasses in confined places such as a pipe)
- Backpressure是可選的,並非所有的ReaciveX實現都包含了Backpressure,但是能實現當然是更好的。
- observer實現了Request Notification,並能理解和響應OnSubscribe Notification,是Observable實現Backpressure的先決條件。
- observer收到OnSubscribe Notification時會向其subscribe的Observable發生一個Request Notification。該Notification表示請求一定數量的item。Observable應該回復給observer不大於該數量的item。如果有需要的話,Observable可以在後面附加一個OnCompleted/OnError, 甚至在observer 開始request前,都可以發出OnCompleted/OnError.
- 如果Observable不支持Backpressure,其在收到observer的Request時,應該回復一個OnError表明其不支持。
- Requests可以累加。比如,observer 向Observable發送了3次Request,分別要求3,5,10個item,那麼最終總計Observable會向observer發送18個item。
- 如果Observable產出了大於observer要求數量的item,如何處理多餘的item取決於Observable,可以丟棄,暫存或者其他處理方式。