Преобразование Rx-Observables в Twitter-фьючерсы в Scala
Я хочу наиболее эффективно реализовать следующие функции. Они нужны мне для реализации биекций для автоматического преобразования между указанными типами.
def convertScalaRXObservableToTwitterFuture[A](a: Observable[A]): TwitterFuture[A] = ???
def convertScalaRXObservableToTwitterFutureList[A](a: Observable[A]): TwitterFuture[List[A]] = ???
Я сталкивался с этой статьей на связанную тему, но я не могу заставить ее работать.
1 ответ
К сожалению, утверждение в этой статье неверно и не может быть подлинной биекции между Observable
и что-нибудь подобное Future
, Дело в том, что Observable
является более мощной абстракцией, которая может представлять вещи, которые не могут быть представлены Future
, Например, Observable
может фактически представлять бесконечную последовательность. Например, см. Observable.interval
, Очевидно, что нет способа представить что-то подобное с Future
, Observable.toList
Call, используемый в этой статье, явно упоминает, что:
Возвращает
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
на первом месте?