ReactiveX Observable規範

Observable規範(Observable Contract):
http://reactivex.io/documentation/contract.html
“The Observable Contract”, 在ReactiveX的官方文檔,網站以及源碼註釋上經常出現。是基於微軟在2010發表的 Rx Design Guidelines(用於描述Rx.Net是如何實現ReactiveX的),對Observable機制進行的規範化嘗試。下文基本是全文翻譯,稍微插一點我自己的理解。

  1. 注: 下面描述的 “通信”, “發出”, “收到”, “Notification” 等不代表傳統意義上的信息收發,而是在抽象層面的描述,在實現層面可以理解爲一個對象調用另外一個對象的方法

  2. 注: “Item”代表Observable向observer發送的一條信息(OnNext/OnError/OnCompleted)。

  3. 注: “Subscription” 是對observer subscribe Observable這一訂閱關係的表述。

  4. Notifications, 代表抽象概念上,對象之間通信的“信息”。

    1. Observable向observer發送的Notification:
      1. OnNext: 表示Observable向observer發送了一條信息。
      2. OnCompleted: 表示Observable圓滿結束髮送任務,不會再發送信息。
      3. OnError: 表示Observable因爲某個錯誤被終止,不會再發送信息。
      4. OnSubscribe (可選): 表明Observable開始準備接收來自observer的Request notifications(見下面的Backpressure介紹)
    2. observer可以向Observable發送下列Notification進行通信:
      1. Subscribe:表示observer開始接收來自Observable的notifications.
      2. Unsubscribe: 表示observer不再接收來自Observable的notifications.
      3. Request (可選): 表示observer向Observable請求不多於一定數量的附加性onNext notification.(見下面的Backpressure介紹)
  5. Notifications準則:

    1. Observable可以發出>=0個OnNext, 每次代表一個獨立的item發出。
    2. 發送序列最後接一個*OnCompleted或OnError, 但是兩者是互斥出現*的。
    3. 一旦發出了OnCompleted或者OnError, 後續不再發送任何Notification。
    4. 允許Observale**不發出任何Notification**。
    5. 允許Observable永遠不發出OnCompleted或OnError, 永不結束
    6. Observable可以自始至終只發一個OnCompleted或OnError。
    7. 注: 上述對Observable的特殊情況描述在RxJava中都有對應的Observable擴展類。
    8. Observable必須線性的向observers發送Notification, 禁止並行發送。比如,來自不同線程的Notification, 在投遞時,Notification之間必須有明確的可以界定的先後關係(比如兩個線程T1, T2都會調OnNext, 那麼T1和T2調OnNext的過程中不能產生交織,比如T1先執行OnNext,在執行過程中,即使切換到了T2,T2也需要等待T1的OnNext完整執行以後才能執行自己的OnNext,其實描述的並不精確,只是爲了好理解)
  6. Observable結束:

    1. 只要Observable沒有發出OnCompleted或OnError, 從observer角度看,這個Observable仍然是“活”的(即使它現在並沒有發送Notification),可以繼續和該Observable進行通信(比如Unsubscribe或Request)。
    2. Observable發出OnCompleted或OnError代表Observable的結束,不能再通信
    3. OnError必須攜帶錯誤的原因描述(這意味着OnError回傳null是非法的)。
    4. Observable結束前必須保證向其observers發送了OnCompleted/OnError。
  7. 訂閱(Subscribing)和註銷(Unsubscribing):

    1. Observable在收到observer的Subscribe後就可以立即向observer發送Notification.
    2. observer 向Observable發出Unsubscribe後, Observable會嘗試停止向observer發送Notification。但是不保證Observable不會再向observer發送Notification(注:因此observer需要自己處理這種情況)
    3. Observable發送OnError/OnCompleted**代表着Subscription的結束**。這種情況下,observer不需要再向Observable發送UnSubscribe來結束Subscription。
  8. 多重Observer

    1. 假設有兩個observer A, B. A先subscribe了Observable,Observable發送了複數個Notification給A,然後B subscribe了 Observable。
    2. 在B subscribe 時,取決於Observable的具體策略或者實現,可能有如下的行爲:
      1. Observable在下一次發送Notification時同時發給A和B。
      2. Observable將B subscribe之前發出的Notification replay給B。
      3. Observable會向B發送次序不同於A的Notification序列。
      4. 等等其他。
    3. 不保證subscribe同一個Observable的複數個observer可以收到相同次序的Notification序列
  9. Backpressure(背壓: refers to pressure opposed to the desired flow of gasses in confined places such as a pipe)

    1. Backpressure是可選的,並非所有的ReaciveX實現都包含了Backpressure,但是能實現當然是更好的。
    2. observer實現了Request Notification,並能理解和響應OnSubscribe Notification,是Observable實現Backpressure的先決條件。
    3. observer收到OnSubscribe Notification時會向其subscribe的Observable發生一個Request Notification。該Notification表示請求一定數量的item。Observable應該回復給observer不大於該數量的item。如果有需要的話,Observable可以在後面附加一個OnCompleted/OnError, 甚至在observer 開始request前,都可以發出OnCompleted/OnError.
    4. 如果Observable不支持Backpressure,其在收到observer的Request時,應該回復一個OnError表明其不支持。
    5. Requests可以累加。比如,observer 向Observable發送了3次Request,分別要求3,5,10個item,那麼最終總計Observable會向observer發送18個item。
    6. 如果Observable產出了大於observer要求數量的item,如何處理多餘的item取決於Observable,可以丟棄,暫存或者其他處理方式。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章