如何延迟物品,但一开始只有一次?

时间:2018-01-18 18:51:45

标签: rx-java2

delay运算符将所有项目延迟指定的时间。我想延迟和缓冲项目只有前N秒。 N秒后应该没有延迟。我需要在以下代码中执行此操作。

private Emitter<Work> workEmitter;

// In the constructor.
Flowable.create(
        (FlowableOnSubscribe<Work>) emitter -> workEmitter = emitter.serialize(),
        BackpressureStrategy.BUFFER)
    .observeOn(Schedulers.from(executor))
    .subscribe(work -> process(work));

// On another thread, as work comes in, ...
workEmitter.onNext(t);

我想要做的是在前N秒内推迟处理工作,但在此之后不推迟。我尝试了delaySubscription,但在延迟期间它workEmitternull。我想这样做的原因是在初始阶段使CPU可用于其他重要工作。

2 个答案:

答案 0 :(得分:1)

您可以使用UnicastProcessor并在延迟一段时间后订阅它:

FlowableProcessor<Work> processor = UnicastProcessor.<Work>create().toSerialized();

processor.delaySubscription(N, TimeUnit.SECONDS)
.observeOn(Schedulers.from(executor))
.subscribe( work -> process(work));

// On another thread, as work comes in, ...
processor.onNext(t);

UnicastProcessor将保留缓冲工作项,直到delaySubscription的时间过去,然后切换到它。

答案 1 :(得分:0)

您可以延迟创建observable,然后订阅它。

Decimal('1.100000000000000088817841970012523233890533447265625')

在N秒过去之前,这不会启动观察链。