我想在Kotlin中尝试RxJava,以使编码更容易,所以我制作了这个代码:
fun postAnswers() {
disposable = getToken.execute().subscribe({ token ->
questions.forEach { form ->
val answers = form.answers?.filter { it.isChecked }?.map { it.answer_id }
disposable = postAnswer.execute(token?.token!!, SavedAnswer(form.form_id, answers)).subscribe({
//Post live data about success
}, {
//Post live data failure
})
}
}, {
//Post live data failure
})
}
但是我有一个更好的印象,但我不知道如何做。基本上,我想要实现的是从数据库获取Token对象,该对象返回Flowable Token?然后用它在for周期中调用postAnswer,因为我需要分别发布每个答案(这就是API的设计方式)。在那之后,postAnswer只返回Completable,但是我需要让Activity知道(这是从ViewModel代码获得的)
我已经考虑过使用.flatMap或.concat函数,但不确定在这种情况下是否会有所帮助。另外,我是否需要将getToken.execute()分配给一次性对象?
谢谢您的回答
编辑:
这是我的问题清单:
private var questions: List<Form> = emptyList()
它被viewModel函数填充
答案 0 :(得分:1)
尝试考虑嵌套:)这可能在这里做:对于每个保存的答案,发布请求。
disposable = getToken.execute()
.switchMap { token -> // switchMap because your old token is probably invalidated
val savedAnswers = questions
.map { form->
val formId = form.form_id
form.answers
?.filter { it.isChecked }
?.map { it.answer_id }
?.let { SavedAnswer(formId, answersIds) }
?: SavedAnswer(formId, emptyList() ) // if no checked answer, then return empty list of ids
}
Observable.list(savedAnswers)
.concatMap { savedAnswer -> // concatMap because you want the whole list to be executed once per time, use flatMap if you want it to be in parallel.
postAnswer.execute(token?.token!!, savedAnswer) // FYI: !! is bad practice in Kotlin, try make it less anbiguous
}
.toList()
}
.subscribe({ listOfResultsFromPostings : List<SomeResultHere> ->
//Post live data about success
}, {
//Post live data failure
})