【问题标题】:How to run a Firebase Transaction using Kotlin Coroutines?如何使用 Kotlin 协程运行 Firebase 事务?
【发布时间】:2021-12-08 11:27:39
【问题描述】:

我正在尝试在 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?) {
                    }

                })
        }
    }
}

【问题讨论】:

    标签: firebase kotlin firebase-realtime-database kotlin-coroutines


    【解决方案1】:

    你可以把它包裹在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.resume 和 Continuation.resumeWithException 可以在运行挂起函数的同一堆栈帧中同步使用,也可以稍后在同一线程中或从不同的执行线程中异步使用。

    【讨论】:

      【解决方案2】:

      鉴于 transactions 上的 Firebase 文档中的 Kotlin example 使用与您相同的回调样式,似乎确实没有对协同例程的特定支持。

      可能值得在Android SDK repo 上发布一个问题以添加它,或者了解它未添加的原因。

      【讨论】:

        猜你喜欢
        • 2020-10-12
        • 2019-12-25
        • 1970-01-01
        • 2019-08-07
        • 1970-01-01
        • 2019-12-18
        • 2021-02-23
        • 2020-01-04
        • 1970-01-01
        相关资源
        最近更新 更多