我正在嘗試在 Kotlin 中的暫停函式下運行 Firebase 事務,但我沒有看到有關它的檔案。
我正在使用
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.5.2'
對于帶有 firebase 的協程(例如:setValue(*).await())但似乎沒有用于runTransaction(*) 的await 函式
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?) {
}
})
}
}
}
uj5u.com熱心網友回復:
你可以把它包裝在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)
}
})
}
掛起協程
獲取掛起函式內的當前延續實體并掛起當前運行的協程。
在這個函式中,Continuation.resume 和 Continuation.resumeWithException 可以在掛起函式運行的同一個堆疊幀中同步使用,也可以稍后在同一執行緒或不同的執行執行緒中異步使用。
uj5u.com熱心網友回復:
鑒于Firebase事務檔案中的Kotlin 示例使用與您擁有的相同的回呼樣式,似乎確實沒有對協同例程的特定支持。
可能值得在Android SDK 存盤庫上發布問題以添加它,或者了解為什么沒有添加它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/333925.html
標籤:火力基地 科特林 Firebase 实时数据库 kotlin 协程
