我有一个可观察的,我是从对象列表中创建的。对于列表中的每个对象,我发出了一个网络请求,但我想在列表中的每个项目之间加一个延迟,以便稍微隔开请求。这是我的代码片段。
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);
}
});
据我所知,使用延迟或缓冲区并不能完全适用于这种情况。
答案 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);
}
});