我有一个观察到:
几秒钟后发出数据。
可以多次触发。
操作不能并行执行。所以我们需要一个缓冲区。
我理解这一点并不清楚,所以让我用例子来解释:
Observable<IPing> pingObservable = Observable.defer(() ->
new PingCommand(account, folders)
.post()
.asObservable()
);
这是主要特征。它不应该在前一个执行时再次被调用,但它应该记住用户再次请求它。所以我创建了关闭缓冲区PublishSubject
closeBuffer = PublishSubject.create();
现在我想知道如何合并它。
我试过这个:
Observable.defer(() -> new PingCommand(account, folders)
.post()
.asObservable()
.buffer(() -> closeBuffer)
.flatMap(Observable::from)
.first()
);
但它没有按我的意愿工作。
编辑: 我会试着更好地解释一下:
我正在向服务器发送POST - 我们可以等待几分钟的响应(因为它是Exchange ActiveSync PUSH)。当一个请求发送时,我无法再次ping通。所以我必须等到一个请求完成。我不需要缓冲那些可观察量 - 只是在用户请求ping时的信息 - 并在第一次完成后发送请求。我只是在学习反应,所以我不知道如何真正使用复杂的功能,如背压。
这就是我想要解决这个问题的方法(伪代码)
??????<Result> request
= ????.???()
.doOnNext( result -> { … })
.doOnSubscribe(() -> { … })
.doOnCompleted(() -> { … })
.…
//__________________________________________________________
Observable<Result> doAsyncWork(Data data) { … } // this is API function
//__________________________________________________________
// api usage example
Subscription s1 = doAsyncWork(someData).subscribe() // start observing async work; executed doOnSubscribe
Subscription s2 = doAsyncWork(someData).subscribe() // wait for async work result …
//__________________________________________________________
// after some time pass, maybe from other thread
Subscription s1 = doAsyncWork(someData).subscribe() // wait for async work result …
//__________________________________________________________
// async work completes, all subscribers obtain the same result; executed doOnCompleted
//__________________________________________________________
// again
Subscription s1 = doAsyncWork(someData).subscribe() // start observing async work; executed doOnSubscribe
// async work completes, subscriber obtains result; executed doOnCompleted
显然,我可以使用if
,但我想知道如何以适当的方式做到这一点。