Java 如果存在较大延迟,如何在可观察到的项目间情绪上运行函数?

Java 如果存在较大延迟,如何在可观察到的项目间情绪上运行函数?,java,rx-java,delay,observable,reactive-programming,Java,Rx Java,Delay,Observable,Reactive Programming,我有一个从UI收到的发布主题: myPublishSubject .map { ... } .doOnNext { // using emitted item } .timeout (...) // wait for the gap! .doOnNext { // running a function after a specif

我有一个从UI收到的发布主题:

myPublishSubject
        .map {
            ...
        }
        .doOnNext {
            // using emitted item
        }
        .timeout (...) // wait for the gap!
        .doOnNext {
            // running a function after a specific gap between two item
        }
        .subscribe()
我想在最后一次发射后等待一段特定的时间(不是onComplete,因为它会在以后继续发射),然后运行一个函数。这可以解释为项目与情绪之间的差距


我正在寻找类似于超时的东西,但这个方法的问题是它会错误地杀死可观察对象。

您必须对发布和切换地图有点创造性,例如:

PublishSubject<Integer> ps = PublishSubject.create();

ps.publish(o -> 
    o.mergeWith(
        o.switchMap(e -> 
             Observable.just(1).delay(200, TimeUnit.MILLISECONDS)
            .ignoreElements()
            .doOnCompleted(() -> System.out.println("Timeout action: " + e))
        )
    )
).subscribe(System.out::println);

ps.onNext(1);
ps.onNext(2);

Thread.sleep(100);

ps.onNext(3);

Thread.sleep(250);

ps.onNext(4);

Thread.sleep(250);
PublishSubject ps=PublishSubject.create();
ps.publish(o->
o、 合并(
o、 开关图(e->
可观察的。仅(1)延迟(200,时间单位。毫秒)
.ignoreElements()
.doOnCompleted(()->System.out.println(“超时操作:+e))
)
)
).subscribe(System.out::println);
ps.onNext(1);
ps.onNext(2);
睡眠(100);
ps.onNext(3);
睡眠(250);
ps.onNext(4);
睡眠(250);

它通过两种方式共享源和路由工作,一种是直接发射,另一种是馈送一个
开关映射
,当接收到一个新项目时,启动一个延迟的
可观察的
,并对其完成作出反应(忽略原始触发元素以避免由于
合并
)而重复事件)。当宽限期内出现新信号时,
switchMap
将取消先前的延迟,并从较新的延迟开始。

您必须对
publish
switchMap
有点创意,例如:

PublishSubject<Integer> ps = PublishSubject.create();

ps.publish(o -> 
    o.mergeWith(
        o.switchMap(e -> 
             Observable.just(1).delay(200, TimeUnit.MILLISECONDS)
            .ignoreElements()
            .doOnCompleted(() -> System.out.println("Timeout action: " + e))
        )
    )
).subscribe(System.out::println);

ps.onNext(1);
ps.onNext(2);

Thread.sleep(100);

ps.onNext(3);

Thread.sleep(250);

ps.onNext(4);

Thread.sleep(250);
PublishSubject ps=PublishSubject.create();
ps.publish(o->
o、 合并(
o、 开关图(e->
可观察的。仅(1)延迟(200,时间单位。毫秒)
.ignoreElements()
.doOnCompleted(()->System.out.println(“超时操作:+e))
)
)
).subscribe(System.out::println);
ps.onNext(1);
ps.onNext(2);
睡眠(100);
ps.onNext(3);
睡眠(250);
ps.onNext(4);
睡眠(250);

它通过两种方式共享源和路由工作,一种是直接发射,另一种是馈送一个
开关映射
,当接收到一个新项目时,启动一个延迟的
可观察的
,并对其完成作出反应(忽略原始触发元素以避免由于
合并
)而重复事件)。当宽限期内出现新信号时,
switchMap
将取消先前的延迟,并从较新的延迟开始。

您可以使用
flatMap()/concatMap()
并将延迟放在其中。@PhoenixWang我不确定如何使用
flatMap()/concatMap()
!您可以使用
flatMap()/concatMap()
并将延迟放在其中。@PhoenixWang我不确定如何使用
flatMap()/concatMap()