天天看點

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,可以丢棄,暫存或者其他處理方式。

繼續閱讀