首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >立即交付第一个项目,下面的项目为“debounce”

立即交付第一个项目,下面的项目为“debounce”
EN

Stack Overflow用户
提问于 2015-05-09 20:40:11
回答 14查看 15.7K关注 0票数 43

考虑以下用例:

  • 需要尽快交付第一个项目
  • 需要通过1秒超时

解除以下事件的影响

我最终实现了基于OperatorDebounceWithTime的自定义操作符,然后像这样使用它

代码语言:javascript
复制
.lift(new CustomOperatorDebounceWithTime<>(1, TimeUnit.SECONDS, Schedulers.computation()))

CustomOperatorDebounceWithTime立即交付第一个项目,然后使用OperatorDebounceWithTime操作符的逻辑来去除后面的项目。

有没有更简单的方法来实现所描述的行为?让我们跳过compose运算符,它不能解决问题。我正在寻找一种不实现自定义运算符的方法来实现这一点。

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2015-05-10 06:42:43

更新:

从@lopar的评论来看,一个更好的方式是:

代码语言:javascript
复制
Observable.from(items).publish(publishedItems -> publishedItems.limit(1).concatWith(publishedItems.skip(1).debounce(1, TimeUnit.SECONDS)))

像这样的东西可以工作吗:

代码语言:javascript
复制
String[] items = {"one", "two", "three", "four", "five", "six", "seven", "eight"};
Observable<String> myObservable = Observable.from(items);
Observable.concat(myObservable.first(), myObservable.skip(1).debounce(1, TimeUnit.SECONDS))
    .subscribe(s -> System.out.println(s));
票数 40
EN

Stack Overflow用户

发布于 2015-10-08 07:26:55

@LortRaydenMK和@lopar的答案是最好的,但我想建议一些其他的东西,以防它对你或遇到类似情况的人更有效。

有一个debounce()的变体,它接受一个函数,该函数决定在多长时间内去掉这个特定的项。它通过返回一个在一段时间后完成的可观察对象来指定这一点。您的函数可以为第一项返回empty(),为其余项返回timer()。类似于(未测试的):

代码语言:javascript
复制
String[] items = {"one", "two", "three", "four", "five", "six"};
Observable.from(items)
    .debounce(item -> item.equals("one")
            ? Observable.empty()
            : Observable.timer(1, TimeUnit.SECONDS));

诀窍是这个函数必须知道哪一项是第一项。您的序列可能知道这一点。如果不是这样的话,你可能不得不用range()或者别的什么东西来zip()。在这种情况下,最好使用另一个答案中的解决方案。

票数 18
EN

Stack Overflow用户

发布于 2017-03-08 15:53:51

一个简单的解决方案是使用从the answer for the same question for RxJS转换而来的RxJava 2.0,它结合了throttleFirst和去反跳,然后删除重复项。

代码语言:javascript
复制
private <T> ObservableTransformer<T, T> debounceImmediate() {
    return observable  -> observable.publish(p -> 
        Observable.merge(p.throttleFirst(1, TimeUnit.SECONDS), 
            p.debounce(1, TimeUnit.SECONDS)).distinctUntilChanged());
} 

@Test
public void testDebounceImmediate() {
    Observable.just(0, 100, 200, 1500, 1600, 1800, 2000, 10000)
        .flatMap(v -> Observable.timer(v, TimeUnit.MILLISECONDS).map(w -> v))
        .doOnNext(v -> System.out.println(LocalDateTime.now() + " T=" + v))
            .compose(debounceImmediate())
            .blockingSubscribe(v -> System.out.println(LocalDateTime.now() + " Debounced: " + v));
}

使用limit()或take()的方法似乎不能处理长时间的数据流,在这种情况下,我可能希望继续观察,但仍然会立即对第一个事件采取行动。

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

https://stackoverflow.com/questions/30140044

复制
相关文章

相似问题

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