Повторное использование части потока RxJava
Вероятно, это вопрос rx newbee.
Если у меня есть два потока RX, которые имеют некоторые общие части, есть ли возможность извлечь и использовать их повторно?
Вот пример псевдокода:
someManager.getInfo(id) returns a Single<SometInfo>
Это веселье принимает идентификатор и должен вернуть только один со статусом
fun getStatus(id: String): Single<Status> =
someManager.getInfo(id)
.flattenAsObservable { it.items }
.map { getSomeProp(it) } // from here
.toList()
.map { getStatus(it) }
.doOnSuccess { getStatusRelay(id).accept(it) } // until here it's common
и этот не берет идентификатор, но уже является объектом и должен проверить, если статус в порядке
fun isStatusOk(info: SomeInfo): Single<Boolean> =
Observable.fromIterable(info.items)
.map { getSomeProp(it) } // from here
.toList()
.map { getStatus(it) }
.doOnSuccess { getStatusRelay(id).accept(it) } // until here it's common
.map { it == Status.OK }
заранее спасибо
2 ответа
Вы также можете использовать функцию расширения
fun Observable<Item>.convertToSingeStatus(): Single<Status> =
this.map { getSomeProp(it) }
.toList()
.map { getStatus(it) }
.doOnSuccess { getStatusRelay(id).accept(it) }
А потом
fun getStatus(id: String): Single<Status> =
someManager.getInfo(id)
.convertToSingeStatus()
.doOnSuccess { getStatusRelay(id).accept(it) }
Феникс Ван предложил Трансформеры. Я попробовал их, и после некоторых экспериментов, кажется, я получил это работает.
Я создал SingleTransformer:
private fun getStatus() =
SingleTransformer<SomeInfo, Status> {
it.flatMap {
Observable.fromIterable(it.items)
.map { getSomeProp(it) }
.toList()
.map { getStatus(it) }
}
}
И тогда я могу рефакторинг
fun getStatus(id: String): Single<Status> =
someManager.getInfo(id)
.compose(getStatus())
.doOnSuccess { getStatusRelay(id).accept(it) }
и это тоже
fun isStatusOk(info: SomeInfo): Single<Boolean> =
Single.just(info)
.compose(getStatus())
.doOnSuccess { getStatusRelay(id).accept(it) }
.map { it == Status.OK }
Надеюсь, это поможет кому-то еще.