我正在一个项目中从 RxJava 切换到 Kotlin 协程,用协程的替代方式替换所有的 Single 和 Observable 返回类型。我仍在努力理解以下构造:一个接口(例如 repository 的接口)提供数据查询访问,并返回一个 RxJava Single。实现使用 Single.create 创建一个 Single 对象,并使用 onSuccess/onError 发出结果。现在,实现需要做的是创建一个带有回调的监听器,并将该监听器注册到某些内容上。该创建的监听器的回调将调用自制 Single 的 onSuccess/onError。例如,使用 firebase(尽管我的问题不限于 firebase):
interface Repository {
fun getData(query: Query): Single<DataSnapshot?>
}
fun getData(query: Query): Single<DataSnapshot?> = Single.create { emitter ->
query.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onCancelled(error: DatabaseError?) {
emitter.onError(Exception())
}
override fun onDataChange(data: DataSnapshot?) {
emitter.onSuccess(data)
}
})
}
现在我希望的是接口方法返回coroutine Deferred。该如何创建实现以便还可以注册带有回调的监听器,其结果将由Deferred交付? 我没有看到使用这些协程构建程序(如async、launch等)完成onSuccess / onError所需的方式。
interface Repository {
fun getData(query: Query): Deferred<DataSnapshot?>
}
suspend fun getData(query: Query): DataSnapshot?
作为一个经验法则,你不应该有返回 Deferred 的函数。 - Roman Elizarov