检查一个特定事件,然后检查另一个特定事件,并使用RxJava发出成功

饰品

我需要检查一个无限的可观察到的事件(来自设备的事件)是否发出特定事件,让我们将其称为“已启动”,然后再调用另一个“已完成”。但是,在这两个事件之间,可以接收任意数量的不同事件,因此必须将其忽略。其结果应该是Completable.complete(),当在设置的超时之前“开始”事件之后接着“完成”事件时,此函数将成功。

对于这个问题,我有一个可行的解决方案,但是它看起来很丑且太复杂了,我认为可能有一个更优雅/更简单的解决方案。我当前的代码看起来像这样,我已经对代码进行了概括,因此更容易理解,基本上在此示例中,我检查了Flowable在发出10秒超时之前发出数字“ 5”之后是否收到数字“ 8” 。:

    Flowable<Long> events = Flowable.interval(1, TimeUnit.SECONDS, testScheduler)
            .publish().autoConnect(1);

    return events
            .filter(number -> number == 5)
            .firstElement()
            .concatMapCompletable(number -> {
                if (number == 5) {
                    return events
                            .filter(number2 -> number2 == 8)
                            .firstElement()
                            .concatMapCompletable(number2 -> {
                                if (number2 == 8) {
                                    return Completable.complete();
                                } else {
                                    return Completable.error(new Exception("Number 3 expected, got " + number2));
                                }
                            });
                } else {
                    return Completable.error(new Exception("Number 2 expected, got " + number));
                }
            })
            .timeout(10, TimeUnit.SECONDS, Completable.error(new Exception("Timeout!")));

编辑:我已经找到了一个更清洁的版本,但是这似乎很奇怪,因为我正在使用.filter运算符然后在收到的第一个元素上完成操作,我将其发布在下面以供参考:

    Flowable<Long> events = Flowable.interval(1, TimeUnit.SECONDS, testScheduler)
            .publish().autoConnect(1);

    TestObserver testObserver = events
            .filter(number -> number == 5)
            .firstElement()
            .concatMapCompletable(number ->
                    events
                            .filter(number2 -> number2 == 8)
                            .firstElement()
                            .concatMapCompletable(number2 ->
                                    Completable.complete()))
            .timeout(10, TimeUnit.SECONDS, Completable.error(new Exception("Timeout!")))
            .test();

UPDATE2:我更满意的版本:

    Flowable<Long> events = Flowable.interval(1, TimeUnit.SECONDS, testScheduler)
            .publish().autoConnect(1);

    TestObserver testObserver = events
            .skipWhile(number -> number != 5)
            .firstElement()
            .flatMapCompletable(number -> Completable.fromObservable(events
                    .takeUntil(number2 -> number2 == 8)
                    .toObservable()
            ));
气泡

我不确定要确切地做什么,但可以使用如下所示的bufferwindow运算符:

Flowable.just(1, 2, 3, 4, 5)
        .buffer(2, 1)
        .filter(e -> e.size() > 1)
        .flatMapCompletable(e -> {
            int first = e.get(0);
            int second = e.get(1);
            if (first == 2) {
                if (second == 3) {
                    return Completable.complete();
                } else {
                    return Completable.error(new Exception("..."));
                }
            }

            return Completable.fromObservable(Observable.just(e));
        })

更新

Observable<Long> source = Observable.interval(1, TimeUnit.SECONDS)
        .share();

source
        .skipWhile(e -> e != 5)
        .flatMapCompletable(e -> Completable.fromObservable(source
                .takeUntil(x -> x == 8)
                .timeout(10, TimeUnit.SECONDS)))
        .subscribe();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

HTML元素侦听一个事件,然后侦听另一个事件

检查使用 CMockery 测试的函数是否调用另一个特定函数

停止在另一个事件侦听器中传播特定事件

如何检查事件目标是否在一个元素内或另一个元素内?

Fancybox与另一个事件

从另一个呼叫一个事件

如何使用sql检查特定列值是否包含另一个特定列值

如何通过停止特定属性在另一个按钮中调用一个按钮单击事件

在一个事件中设置一个“ int”,并在另一个事件中使用它

使用焦点事件显示另一个元素

从另一个类使用的表单事件

如何检查我的 SQL 数组中的特定元素是否后跟另一个元素?

从类对象中检查特定值并获取另一个键的值

如何检查特定类的所有对象是否也共享另一个类?

如何检查特定对象键是否作为另一个对象键的值存在?

检查GPS位置是否在android中另一个GPS位置的特定半径内

对照另一个列表检查列表,并根据特定匹配进行输出

如何检查数组中的元素是否被另一个特定元素包围

使用另一个布尔检查选择案例

点击事件触发另一个按钮事件

使事件取决于另一个事件的完成

如何使用Javascript检查用户是否将焦点从一个特定元素转移到另一个元素?

从csv文件读取特定的列,然后使用python写入另一个CSV

检查是否使用Moq从另一个方法调用了一个方法

如何使用MATLAB检查一个椭圆在另一个椭圆内?

使用Google Script检查一个日期是否大于另一个日期

在* ngIf上使用“或”检查变量的一个或另一个值

使用typetag检查一个类型是否是另一个的超类型

在Electron 1.X版中,如何从一个BrowserWindow发出事件并在另一个BrowserWindow中使用它?