【问题标题】:How to delay return callback until async task finishes?如何延迟返回回调直到异步任务完成?
【发布时间】:2020-10-21 13:45:41
【问题描述】:

在onSuccessListener执行完毕后我要调用返回数据的函数中。

private fun getFirebaseDataReturnsResult(
        fieldName: String,
        documentName: String,
        userUID: String) : String {

        var data : String? = null
        val docRef = db.collection(documentName).document(userUID)

        docRef.get(source)
            .addOnSuccessListener { document ->
                if (document != null) {
                    data = document.getString(fieldName).toString()
                }
            }
            .addOnFailureListener {
                docRef.get().addOnSuccessListener { document ->
                        data = document?.getString(fieldName).toString()
                }.addOnFailureListener { exception ->
                    data = exception.message.toString()
                }
            }
        return data!!
    }

db 是 Cloud Firestore 的一个实例。 在 IO 协程范围内的 onViewCreated() 上调用 getFirebaseDataReturnsResult() 方法。

我尝试在返回数据之前添加delay(),但我认为这似乎是一种不好的做法。

【问题讨论】:

    标签: android firebase google-cloud-firestore async-await kotlin-coroutines


    【解决方案1】:

    docRef.get() 是异步的,会立即返回一个 Task 对象。如果你想在协程中使用这个对象,你应该强烈考虑将getFirebaseDataReturnsResult 设置为suspend fun 并将该Task 对象转换为可以使用kotlinx-coroutines-play-services 等待的对象。这也将省去您必须将侦听器附加到任务的麻烦,您可以使用 try/catch 代替。

    【讨论】:

    猜你喜欢
    • 2017-08-11
    • 1970-01-01
    • 2012-07-11
    • 2018-09-26
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2018-06-13
    相关资源
    最近更新 更多