如果有很大的延迟,如何在项目情感之间的 Observable 上运行函数?

Posted

技术标签:

【中文标题】如果有很大的延迟,如何在项目情感之间的 Observable 上运行函数?【英文标题】:How to run a function on an Observable between item emotion if there was a big delay? 【发布时间】:2017-06-06 14:21:23 【问题描述】:

我有一个 PublishSubject 接收来自 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,因为它稍后会继续发射)并运行一个函数。可以理解为项目情感之间的差距。

我正在寻找类似 @​​987654322@ 的东西,但这个方法问题是它会因错误而杀死 Observable。

【问题讨论】:

您可以使用flatMap()/concatMap() 并将延迟放入其中。 @PhoenixWang 我不知道应该如何使用flatMap()/concatMap() 【参考方案1】:

你必须对publishswitchMap 有点创意,例如:

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);

它通过共享源和路由以两种方式工作,一种是直接发射,另一种是提供switchMap,当接收到新项目时,启动延迟的Observable并对其完成做出反应(忽略原始触发器元素,以避免由于mergeWith 引起的重复事件)。当宽限期内有新信号时,switchMap 将取消之前的延迟,并从新的延迟开始。

【讨论】:

以上是关于如果有很大的延迟,如何在项目情感之间的 Observable 上运行函数?的主要内容,如果未能解决你的问题,请参考以下文章

如果扬声器远离麦克风,Google Speech/NAudio 会有很大的延迟

我的 UIButtons 有很大的延迟?

如何在Visual Studio项目和单元测试项目之间建立联系?

如何在HTML中的每个项目之间打印带有延迟的列表

控制器和HTML之间的AngularJs ng-model延迟

Apache Beam FixedWindows 之间的延迟