如何使用Kotlin协程运行Firebase事务?



我试图在Kotlin的挂起函数下运行Firebase Transaction,我没有看到关于它的文档。

我用

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.5.2'
使用firebase的协程

(例如:setValue(*).await())),但似乎没有等待函数runTransaction(*)

override suspend fun modifyProductStock(
product: ProductModel,
valueToModify: Long,
replace: Boolean
) {
CoroutineScope(Dispatchers.Main).launch {
val restaurantId = authRepository.restaurantId.value ?: throw Exception("No restaurant!")
val productId = product.id ?: throw Exception("No Product ID!")
val reference = FirebaseDatabase.getInstance().getReference("database/$restaurantId").child("products")
if (replace) {
reference.child(productId).child("stock").setValue(valueToModify).await()
} else {
reference.child(productId).child("stock")
.runTransaction(object : Transaction.Handler {
override fun doTransaction(p0: MutableData): Transaction.Result {
//any operation
return Transaction.success(p0)
}
override fun onComplete(p0: DatabaseError?, p1: Boolean, p2: DataSnapshot?) {
}
})
}
}
}

你可以用suspendCoroutine:

val result: DataSnapshot? = suspendCoroutine { c ->
reference.child(productId).child("stock")
.runTransaction(object : Transaction.Handler {
override fun doTransaction(p0: MutableData): Transaction.Result {
//any operation
return Transaction.success(p0)
}

override fun onComplete(error: DatabaseError?, p1: Boolean, snapshot: DataSnapshot?) {
c.resume(snapshot)
}
})
}

suspendCoroutine

获取挂起函数中的当前延续实例并挂起当前运行的协程。
在这个函数中都是Continuation。简历和延续。resumewitheexception可以在运行挂起函数的同一堆栈帧中同步使用,也可以稍后在同一线程或不同的执行线程中异步使用。

考虑到Firebase文档中关于事务的Kotlin示例使用了与您相同的回调样式,似乎确实没有对协同例程的特定支持。

也许值得在Android SDK repo上发布一个问题来获得它的添加,或者听听为什么它没有被添加。

最新更新