Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android RxJava:链接两个请求并在它们之间执行一些逻辑_Android_Kotlin_Retrofit2_Rx Java2_Flatmap - Fatal编程技术网

Android RxJava:链接两个请求并在它们之间执行一些逻辑

Android RxJava:链接两个请求并在它们之间执行一些逻辑,android,kotlin,retrofit2,rx-java2,flatmap,Android,Kotlin,Retrofit2,Rx Java2,Flatmap,您好,我正在尝试使用flatmap创建一个网络请求链,但不太了解如何执行此操作的过程 目标是做到这一点: 是否执行网络请求1 一旦我从networkRequestOne获得一个结果,对该结果执行一些逻辑,然后执行下一个networkRequestTwo和调用onSuccess,并使用networkRequestTwo返回的响应值 当前代码: delegator.requestOne(requestData) .flatMap ({ response ->

您好,我正在尝试使用flatmap创建一个网络请求链,但不太了解如何执行此操作的过程

目标是做到这一点:

是否执行网络请求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(requestData)
.flatMap({响应->
if(response.issucessful){
cookieStorage.saveSessionOkies(response.header(cookieStorage.COOKIE\u header\u NAME)!!)
}
返回delegator.requestTwo
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(对象:SingleObserver(){
@凌驾
乐趣订阅(一次性d){
}
@凌驾
成功的乐趣(responsewo:responsewo){
callback.onSuccess(responsewo)
}
@凌驾
公共无效申报人(可丢弃的e){
}
});

delegator.requestOne和delegator.requestTwo都连接到一个更新调用,该调用返回一个可观察的

这有点奇怪,您需要在
subscribe
方法中调用回调。如果您已经有了Rx,为什么需要cb?。如果您返回一个
单曲
,并在实际订阅的位置运行回调代码,则会更清楚:

...
// don't forget to handle the `disposable`
doSmth(requestData)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(
            { success -> /* here's your success callback code */},
            { error -> /* handle error here */}
    )
...

fun doSmth(requestData: RequestData): Single<ResponseTwo> = delegator.requestOne(requestData)
        .doOnSuccess(::updateCookies)
        // you can extract the data you need from the first request using `it`
        .flatMap { delegator.requestTwo() }

fun updateCookies(response: Response<ResponseOne>) {
    val cookie = response.header(cookieStorage.COOKIE_HEADER_NAME)!!
    cookieStorage.saveSessionCookies(cookie)
}

我会将
saveSessionCookies
放入
doAfterSuccess()
中,因为这是一个副作用。但除此之外,当前的实现有什么问题吗?返回delegator.requestTwo的行突出显示了一个编译错误,表示它排除了要返回的不可观察的单元?如果我删除If语句,它可以很高兴地从requesttwo返回另一个可观察到的结果saveSessionOkie需要在我调用下一个requests之前执行您实际使用的是非本地返回。也就是说,要么完全删除
return
(最后一行将被解释为返回值),要么使用
return@flatMap
。感谢ttrick做了这件事,并消除了这个错误。cb用于UI级别,而这堆代码在演示者内部执行魔术。它需要来自ui的callbck,因为此代码不在ui类中
// don't forget to handle the `disposable`
delegator.requestOne(requestData)
        .doOnSuccess(::updateCookies)
        .flatMap { delegator.requestTwo() }
        .observeOn(AndroidSchedulers.mainThread())
        .subscribeOn(Schedulers.io())
        .subscribe(
                { success -> callback.onSuccess(success) },
                { error -> callback.onError(error) }
        )

fun updateCookies(response: Response<ResponseOne>) {
    if (response.isSuccessful) {
        val cookie = response.header(cookieStorage.COOKIE_HEADER_NAME)!!
        cookieStorage.saveSessionCookies(cookie)
    }
}