簡體   English   中英

在Scala中將Rx-Observables轉換為Twitter期貨

[英]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。

即使將自己限制為僅有限的ObservableFuture也無法完全表達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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM