【问题标题】:when do you close a Subscriber whos emisor is an Observable with a debounce?你什么时候关闭一个订阅者,他的发射器是一个带有去抖动的 Observable?
【发布时间】:2018-05-17 18:29:18
【问题描述】:

我是 java rx 的新手,我想知道这是否可能。

我有一个 observable,其中包含不断来自控制器的数据。

它做了这样的事情:

observable.asObservable().debounce(10, SECONDS).subscribe(mySubscriber);

final Subscriber<Long> mySubscriber = new Subscriber<Long>() {

        @Override
        public void onCompleted() {
            System.out.println("killing the subscriber");
        }

        @Override
        public void onError(final Throwable throwable) {
        }

        @Override
        public void onNext(final Long number) {
            //some stuff
        }
    };

效果很好,去抖动和 onNext,但是当我停止发送事件时,我正在等待最后一次去抖动(没有信息)将调用 onCompleted() 但它没有

考虑到事件可以在N次后发布,我需要在最后一次去抖动触发后设置超时。

例如。

如果我有 10 秒的去抖动和 20 的超时。

我在第二个 5 之后得到第一个事件。

去抖被触发,将再等待 10 秒。

我在 14 秒得到第二个事件。

Debounce 被触发,我会等到 24 秒。

在 20 秒触发超时并杀死订阅者。

在 24 秒时,我应该在订阅者处收到事件,但已经被杀死了。

考虑到去抖动,我想在最后一次发射之后设置超时。

【问题讨论】:

  • 您必须拥有observable 才能以某种方式完成。如果是主题,请致电onCompleted(),链条将完成。如果它是生成器,请通过timeout 和Observable.empty() 回退等方式停止它。
  • 但它是一个“动态”可观察的,不时发出一个事件,我想要的是如果没有发出 N 时间,我的订阅者将关闭
  • 我在之前的评论中已经提到过这个案例:使用timeout()。
  • times @akarnokd 我想知道如何正确使用超时,例如,如果我有 10 秒的去抖动和 20 的超时,如果我在前 5 秒收到一条消息会发生什么,它调用 debounce 并等待另一个 10,然后我在 15 得到另一个,它将等待另一个 10 ,直到达到 25,但是我的超时将已经被触发并杀死我的订阅者,所以当我发出事件时不会有任何订阅者,那我该如何正确使用超时呢?

标签: java rx-java


【解决方案1】:

不确定我的建议是否是最优雅的方式,但您可以只记录收到的最后一个对象,然后像这样在超时时重新发出它

AtomicReference<Long> lastObject = new AtomicReference<>(null);

Observable
    .interval(100, TimeUnit.MILLISECONDS)
    .doOnNext(i -> lastObject.set(i))
    .debounce(150, TimeUnit.MILLISECONDS)
    .timeout(1000, TimeUnit.MILLISECONDS, Observable.create(emitter -> {
        if (lastObject.get() != null) emitter.onNext(lastObject.get());
        emitter.onComplete();
    }))
    .subscribe(...);

在这个例子中,我们每 100 毫秒发射一次,因为去抖动较高,所以没有发射任何项目。因此,当timeout 发生时,我们会重新发送我们在doOnNext 中在debounce 之前记住的最后一项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    相关资源
    最近更新 更多