Rx Java объединить Single с Completable - PullRequest
2 голосов
/ 10 января 2020

Я запутался, как правильно использовать Single с Completable.
У меня есть метод get, который возвращает Single, а другой метод просто сохраняет данные и ничего не возвращает (Completable)
Код выглядит следующим образом:

fun getUserInfo() : Single<UserInfo>

fun save(token: Token) : Completable

fun initialize() {
    getUserInfo()
        .flatMap { 
            // Get token from UserInfo : val token = userInfor.getToken()
            // Call save(token: Token) method to save data
        }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribeBy(
            onSuccess = {
                // HERE:  Using UserInfo to do somtehing
            },
            onError = {
                Log.d(it)
            }
        )
}  

Как написать код внутри flatMap блока? (Или другой оператор подходит для этого варианта использования?)
Спасибо

1 Ответ

2 голосов
/ 10 января 2020

Вы можете использовать flatMapCompletable:

fun initialize() {
    getUserInfo()
        .flatMapCompletable { userInfo: UserInfo ->
            // save userInfo somewhere. i.e:
            this@MyActivity.userInfo = userInfo
            val token = userInfo.getToken()
            return@flatMapCompletable save(token) 
        }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribeBy(
            onComplete = { // <--------- this becomes onComplete instead of onSuccess
                // Here, you can use userInfo that you saved
            },
            onError = {
                Log.d(it)
            }
        )
}  

Обратите внимание, что в вашем методе subscribeBy(...) не забудьте изменить имя функции обратного вызова с onSuccess(...) на onComplete(...), так как вы преобразование одиночного к завершаемому.

В качестве альтернативы, если вы хотите сохранить userInfo в качестве локальной переменной, вы можете использовать toSingleDefault(...), чтобы выдать его в нисходящем направлении после завершения выполнения завершением из вашего save(...) метода:

fun initialize() {
    getUserInfo()
        .flatMap { userInfo: UserInfo -> // change back to flatmap
            val token = userInfo.getToken()
            return@flatMap save(token).toSingleDefault(userInfo) 
        }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribeBy(
            onSuccess = { userInfo: UserInfo ->
                // do something with userInfo ...
            },
            onError = {
                Log.d(it)
            }
        )
} 
...