Geo*_*e O 4 kotlin firebase firebase-realtime-database kotlin-coroutines
我正在尝试在 Kotlin 中的挂起函数下运行 Firebase 事务,但没有看到任何有关它的文档。
我在用着
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.5.2'
Run Code Online (Sandbox Code Playgroud)
对于带有 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?) {
}
})
}
}
}
Run Code Online (Sandbox Code Playgroud)
你可以将它包装在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)
}
})
}
Run Code Online (Sandbox Code Playgroud)
获取挂起函数中的当前延续实例并挂起当前正在运行的协程。
在此函数中,Continuation.resume 和 Continuation.resumeWithException 可以在运行挂起函数的同一堆栈帧中同步使用,也可以稍后在同一线程或不同的执行线程中异步使用。
| 归档时间: |
|
| 查看次数: |
449 次 |
| 最近记录: |