首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RxJava等待单个事件,RxJava

RxJava等待单个事件,RxJava
EN

Stack Overflow用户
提问于 2019-08-16 11:31:31
回答 2查看 993关注 0票数 1

你如何等待一个值出现在一个可以观察到的时间点上?

我在找这样的东西:

代码语言:javascript
复制
Observable<Acknowledgement> acknowledgementObservable;
port.send(new Message());
Optional<Acknowledgement> ack = acknowledgementObservable.getFirst(100, TimeUnit.MILLISECONDS);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-18 15:44:55

可以通过添加.timeout()和.onErrorComplete() .blockingGet()来做到这一点。

因此,在这个例子中,应该是:

代码语言:javascript
复制
    Acknowledgement ack = acknowledgementObservable
                              .firstElement()
                              .timeout(3, TimeUnit.SECONDS)
                              .onErrorComplete()
                              .blockingGet();

如果超时被击中,ack将为null。

票数 0
EN

Stack Overflow用户

发布于 2019-08-16 17:11:06

首先,将Observable转换为CompletableFuture,如在可实现的未来与可观察的之间的转换中所述

代码语言:javascript
复制
Observable<Acknowledgement> acknowledgementObservable;
port.send(new Message());
CompletableFuture<T> future = new CompletableFuture<>();
acknowledgementObservable
    .doOnError(future::completeExceptionally)
    .single()
    .forEach(future::complete);

然后,使用超时值等待事件:

代码语言:javascript
复制
Acknowledgement ack = future.get(100, TimeUnit.MILLISECONDS);

如果发生超时,它将抛出TimeoutException

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57523882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档