首页 > 解决方案 > 是否可以从函数返回 Firestore 数据?

问题描述

此代码段中,从 Firestore 检索数据:

val docRef = db.collection("cities").document("BJ")
docRef.get().addOnSuccessListener { documentSnapshot ->
    val city = documentSnapshot.toObject<City>()
}

我怎么能把它变成一个函数,返回一个城市对象?像这样的东西:

fun getCity(): City?{
   val docRef = db.collection("cities").document("BJ")
   docRef.get().addOnSuccessListener { documentSnapshot ->
       val city = documentSnapshot.toObject<City>()
       return city
}

当我调用getCity()函数时,我能以某种方式“等待”结果吗?

标签: firebasekotlingoogle-cloud-firestore

解决方案


您需要知道一件重要的事情:

所有 Firestore API 都是异步的。它们立即返回,您必须使用回调来获取结果。无法保证何时调用回调,必须异步处理。 您的getCity()函数将无法立即返回对象。

get()返回一个代表异步查询的 Task 对象(由Play 服务 Task API 提供)。如果您想await()获得结果,最简单的方法是使用kotlinx-coroutines-play-services库将该任务转换为suspend fun可以等待的任务。如果你这样做,你getCity()也应该是 asuspend fun以便它可以将结果异步传递给它的调用者。

另请参阅:如何在 firebase 数据库中使用 kotlin 协程


推荐阅读