【发布时间】:2019-11-22 13:07:22
【问题描述】:
我正在我当前的 Android 应用程序中研究 Kotlin Coroutines & Channels。
我有以下代码来管理远程 Api 调用和控制 UI 副作用
private val historical: CompletableDeferred<List<Any>> = CompletableDeferred()
private val mutex = Mutex()
@ExperimentalCoroutinesApi
fun perform(action: Action): ReceiveChannel<List<Any>> =
produce {
mutex.withLock {
if (historical.isCompleted) {
send(historical.getCompleted())
return@produce
}
send(action.sideEffects)
val networkResponse = repository.perform(action)
send(networkResponse.sideEffects)
send(listOf(networkResponse)).also {
historical.complete(listOf(response))
}
}
}
上面的代码给了我想要的结果,但是我想将它重构为类似的东西 函数式编程“铁路模式”https://android.jlelse.eu/real-world-functional-programming-with-kotlin-arrow-b5a98e72f5e3
我的流程在哪里
stepOne(Historical.completed)
.stepTwo(action.sideEffects)
.stepThree(getReaction())
.stepFour(reaction.sideEffects)
.finalStep(reaction)
这将在任何步骤失败或历史“已完成”时“短路”
在 Kotlin 中是否可以实现这种调用方式?和/或 Kotlin & Arrow.kt?
【问题讨论】:
-
不确定您的代码是做什么的......但是可以使用 Kotlin 和 Arrow 实现面向铁路的编程。看看这个:arrow-kt.io/docs/patterns/monad_comprehensions
-
如果每个都返回一个 observable,你也许可以这样做。请参阅 RxJava 和 RxKotlin
-
面向铁路的编程概念在 Kotlin 中通过 中缀函数 用于相同类型的输入和输出,但结果不同。您能否提供有关您的代码的更多信息(什么是函数和 I/O),以便我可以更好地帮助您解决方法?
-
您可以在没有箭头的情况下实现 ROP - gist.github.com/harikrishnan83/3c4359bbb91e57eba7b962dc9300c6cc。即使使用箭头“Either”,代码的可读性也会稍差(FlatMaps 可能会妨碍阅读步骤,就像您在问题中所写的方式一样)。您可能需要在 gist.github.com/harikrishnan83/a16ef8f2e6f9287482adc2b29fbb23f2 之上添加一个中缀