Преобразование 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 на первом месте?

Другие вопросы по тегам