简体   繁体   English

Rxjava takeuntil 等到第一个 stream 完成

[英]Rxjava takeuntil wait until first stream finishes

I got a simulator class that emit items, it can be controlled to start emitting by: Simulator.emiting -> Observable, true -> started emitting, false, stopped emitting The items are exposed: Simulator.items -> Observable我有一个发射项目的模拟器 class,可以通过以下方式控制它开始发射: Simulator.emiting -> Observable,true -> 开始发射,false,停止发射项目暴露: Simulator.items -> Observable

The items will be processed, processing happen much slower than emitting (processing potentially occurs on another thread)项目将被处理,处理比发射慢得多(处理可能发生在另一个线程上)

I am trying to get an observable that signal when "emitting+processing" starts and ends, so:我试图在“发射+处理”开始和结束时获得一个可观察的信号,所以:

from: start emitting, 1, 2, ,3, end emitting from: 开始发射, 1, 2, ,3, 结束发射

to: start emitting and processing, 1------, 2-----, 3-----, end emitting and processing to: 开始发射和处理, 1-----, 2-----, 3-----, 结束发射和处理

how can I get the emitting+processing observable?我怎样才能得到发射+处理可观察的? I tried using我尝试使用

simulator.items.map { process(it) }.takeUntil(simulator.emitting.filter { it == false }) but this will stop before processing finishes. Simulator.items.map { process(it) }.takeUntil(simulator.emitting.filter { it == false }) 但这将在处理完成之前停止。

So it looks like this is a trivial problem, using zip operator所以看起来这是一个微不足道的问题,使用 zip 运算符

val stoppedEmitting = simulator.emitting.filter { it == false }
val emitted = simulator.items.takeUntil(stoppedEmitting )
val processed = emitted.map { item -> process(item) }

then "zip" op will wait until the last item get processed:然后“zip”操作将等到最后一个项目得到处理:

val processingFlow = emitted.zipWith(processed) { item, processedItem -> ... }
processing.subscribe { }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM