我必须重复安排observable
N
个M
次,每observable
个Observable<Precious> result = <~> // hidden for brevity (it's just a long time consuming observable that can take suppose up to 10 seconds or more)
Observable.timer(M,TimeUnit.SECONDS).compose(x -> result).take(N).subscribe();
秒之间延迟result
秒:
O1 ____ 1秒____的 O2 ____ 1秒____的 O3 ____ 1秒____的 O4 (已完成)
注意开始和结束observable之间没有延迟,
void main(int argc, char *argv[]) {
...
FILE *fp = fopen(argv[1], "rb");
printf("Volume Label: %s\n", seekData(fp, 43, 11));
...
}
unsigned char* seekData(FILE *fp, int offset, int bytes) {
unsigned char* buff = malloc(sizeof(unsigned char)*bytes);
fseek(fp, offset, SEEK_SET);
fread(buff, 1, bytes, fp);
rewind(fp);
return buff;
}
问题这是20 20 20 20 20 20 20 20 20 20 20
可观察到的,它正在进行昂贵的网络呼叫,它会在计时器到期后自行调整,或者我们必须告诉它这样做,如果是这样的话?
答案 0 :(得分:0)
你可以使用concatMap的组合来连接observable,并使用Delay来延迟每个的发射
/**
* Another elegant solution it would be to create an observable with the list of items, and then use
* concatMap to pass all items from the first observable to the second, then this second observable
* can be created used delay operator afterwards.
*/
@Test
public void delayObservablesWithConcatMap() {
Observable.from(Arrays.asList(Observable.just(1), Observable.just(2),Observable.just(3)))
.concatMap(s -> s.delay(100, TimeUnit.MILLISECONDS))
.subscribe(n -> System.out.println(n + " just emitted..."),
e -> {
},
() -> System.out.println("Everybody emitt!"));
new TestSubscriber().awaitTerminalEvent(1000, TimeUnit.MILLISECONDS);
}
您可以在此处查看更多延迟示例https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/utils/ObservableDelay.java
答案 1 :(得分:0)
要从可观察的source
中分隔出项目,以便每隔N秒发出一次,请使用以下模式:
source.zipWith(Observable.interval(1, TimeUnit.SECONDS), (src, dummy) -> src)
这里需要注意的是,如果您的source observable比间隔花费更多时间,那么这些项目就会排队。
现在我已经重新阅读了您的问题和说明,我认为您需要的是:
Observable.interval(1, TimeUnit.SECONDS)
.switchMap(dummy -> result)
这将取消订阅并重新订阅result
每1秒观察一次。只有当result
观察者取消取消订阅时的网络呼叫时,它才会起作用。