【发布时间】:2018-06-15 04:39:42
【问题描述】:
您好,我正在尝试使用 flatmap 创建一系列网络请求,但不太了解如何执行此操作的过程。
我们的目标是这样做:
做networkRequest 1 一旦我从 networkRequestOne 获得结果,对该结果执行一些逻辑,然后执行下一个 networkRequestTwo 和调用 onSuccess 并从 networkRequestTwo 返回响应值。
当前代码:
delegator.requestOne(requestData)
.flatMap ({ response ->
if(response.isSuccessful){
cookieStorage.saveSessionCookies(response.header(cookieStorage.COOKIE_HEADER_NAME)!!)
}
return delegator.requestTwo
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(object : SingleObserver<ResponseTwo>() {
@Override
fun onSubscribe(Disposable d) {
}
@Override
fun onSuccess(responseTwo :ResponseTwo) {
callback.onSuccess(responseTwo)
}
@Override
public void onError(Throwable e) {
}
});
delegator.requestOne 和 delegator.requestTwo 都连接到返回 Single observable 的改造调用
【问题讨论】:
-
我会将
saveSessionCookies放入doAfterSuccess(),因为这是一个副作用。但除此之外,当前的实现有什么问题? -
确实返回 delegator.requestTwo 的行突出显示了一个编译错误,说它排除了要返回的 Unit 不是可观察的?如果我删除 if 语句,它可以愉快地从 requestTwo 中返回另一个 observable
-
saveSessionCookie 需要在我调用下一个请求之前发生
-
您实际上是在使用非本地退货。也就是说,要么完全删除
return(最后一行将被解释为返回值),要么使用return@flatMap。 -
感谢您成功并摆脱了该错误
标签: android kotlin retrofit2 rx-java2 flatmap