[英]Converting Rx-Observables to Twitter Futures in Scala
我想以最活躍的方式實現以下功能。 我需要這些來實現用於在所述類型之間進行自動轉換的雙射。
def convertScalaRXObservableToTwitterFuture[A](a: Observable[A]): TwitterFuture[A] = ???
def convertScalaRXObservableToTwitterFutureList[A](a: Observable[A]): TwitterFuture[List[A]] = ???
我碰到了有關相關主題的這篇文章,但無法正常工作。
不幸的是,該文章中的說法是不正確的, Observable
和諸如Future
東西之間不可能有真正的雙射。 事實是, Observable
是更強大的抽象,可以表示Future
不能表示的事物。 例如, Observable
實際上可能表示一個無限序列。 例如,參見Observable.interval
。 顯然,沒有辦法用Future
來表示這樣的事情。 該文章中使用的Observable.toList
調用明確提到:
返回一個
Single
,它發出一個項目,該列表由有限源ObservableSource
發出的所有項目組成。
后來說:
無限且永不完整的源將永遠不會通過此運算符發出任何信息,並且無限源可能導致致命的OutOfMemoryError。
即使將自己限制為僅有限的Observable
, Future
也無法完全表達Observable
語義。 考慮Observable.intervalRange
,它在某個時間段內一一生成有限的范圍。 使用Observable
,第一個事件在initialDelay
之后發生,然后您在每個period
都得到事件。 使用Future
您只能獲得一個事件,並且必須僅在序列完全生成以便Observable
性完成時才發生。 這意味着通過將Observable[A]
轉換為Future[List[A]]
您會立即打破Observable
的主要優勢-反應性:您無法一一處理事件,必須將它們全部處理在一起。
總結一下文章第一段的主張:
在兩者之間進行轉換,而不會失去它們的異步和事件驅動性質。
是錯誤的,因為轉換Observable[A]
-> Future[List[A]]
完全失去了Observable
的“事件驅動性質”,並且沒有辦法解決。
PS實際上, Future
的功能不如Observable
的事實不足為奇。 如果不是,那么為什么有人首先創建Observable
?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.