【发布时间】:2017-07-28 00:14:34
【问题描述】:
我遇到的问题是这个。我需要对服务器执行几个请求。每个下一个请求都取决于前一个请求的结果。 它们看起来像这样(缩写):
Observable<FileUploadResponse> obsFile = api.uploadFile();
Observable<TokenCreateResponse> obsCreateToken = api.createToken();
Observable<PaymentResponse> obsPayment = api.submitOrder();
我使用 flatMap 创建了一个单独的 observable,它返回 PaymentResponse 对象或在某些要求未满足时发出 onError()。这工作正常,我可以在一次调用中完成所有请求。
问题是我无法在这些请求之间更新 UI。使用当前设置,我在请求开始时显示加载,并在所有请求完成时隐藏它。有没有办法在这些请求之间更新 UI?
我想要的是: 1. 文件上传 - 在 UI 上写一条消息。 2. 创建一个令牌 - 在 UI 上写一条消息。 3. 提交订单 - 在 UI 上写一条消息。 4. 全部完成后,隐藏进度对话框。
我的理解是在每个 API 调用完成时使用 onNext() 发出一些 Observable,然后在所有完成后调用 onComplete()。但是我该怎么做呢?
【问题讨论】:
-
您可以在处理管道中的任何位置使用
doOnNext()方法来查看正在发生的事情以及中间结果是什么,当然还可以在各个线程上观察和订阅 -
另一种可能性是将每个中间类型包装在一个公共包装器中,您将使用该包装器作为
Subscriber的类型。api.uploadFile().flatMap(fileUploadResponse -> Observable.concat(Observable.just(new StatusUpdate(fileUploadResponse)), api.createToken()).flatMap(tokenCreateResponse -> Observable.concat(Observable.just(new StatusUpdate(tokenCreateResponse), api.submitOrder())...之类的东西 - 一个名为 RxSealedUnions 的库对这种方法很有帮助......