在Observable Items RxJava之间添加延迟

时间:2016-09-02 04:03:40

标签: java rx-java observable

我有一个可观察的,我是从对象列表中创建的。对于列表中的每个对象,我发出了一个网络请求,但我想在列表中的每个项目之间加一个延迟,以便稍微隔开请求。这是我的代码片段。

return Observable.from(documentGroupModels).flatMap(new Func1<DocumentGroupModel, Observable<Boolean>>() {
        @Override
        public Observable<Boolean> call(DocumentGroupModel documentGroupModel) {
            return refreshDocumentWithUri(documentGroupModel.getUri(), documentGroupModel.sectionGroupId,
                                          includeExceptions, false);
        }
    });

据我所知,使用延迟或缓冲区并不能完全适用于这种情况。

2 个答案:

答案 0 :(得分:1)

如果延迟是静态的,您可以使用 Zip 间隔运算符的组合,这样您就可以在每次配置间隔时发出一个zip项目。< / p>

检查示例

       @Test
public void delaySteps() {
    long start = System.currentTimeMillis();
    Subscription subscription =
            Observable.zip(Observable.from(Arrays.asList(1, 2, 3)), Observable.interval(200, TimeUnit.MILLISECONDS),
                           (i, t) -> i)
                    .subscribe(n -> System.out.println("time:" + (System.currentTimeMillis() - start)));
    new TestSubscriber((Observer) subscription).awaitTerminalEvent(3000, TimeUnit.MILLISECONDS);
}

此外,您可以使用列表创建一个Observable并使用 concatMap ,然后您可以对发出的每个项目使用延迟。也许这个解决方案更优雅,而且没有Hacky

      @Test
public void delayObservableList() {
    Observable.from(Arrays.asList(1, 2, 3, 4, 5))
            .concatMap(s -> Observable.just(s).delay(100, TimeUnit.MILLISECONDS))
            .subscribe(n -> System.out.println(n + " emitted"),
                       e -> {
                       },
                       () -> System.out.println("All emitted"));
    new TestSubscriber().awaitTerminalEvent(1000, TimeUnit.MILLISECONDS);

}

您可以在此处看到另一个延迟示例https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/utils/ObservableDelay.java

答案 1 :(得分:-1)

使用`delay'操作符,例如

return Observable.from(documentGroupModels).flatMap(new Func1<DocumentGroupModel, Observable<Boolean>>() {
        @Override
        public Observable<Boolean> call(DocumentGroupModel documentGroupModel) {
            return refreshDocumentWithUri(documentGroupModel.getUri(), documentGroupModel.sectionGroupId,
                                          includeExceptions, false).delay(2000, TimeUnit.MILLISECONDS);
        }
    });