You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin协程调用Firestore时如何在回调中返回值并结束函数?

问题解决方法

核心问题原因

你当前代码的问题在于docRef.update()返回的是异步执行的Task对象,你没有等待该异步任务执行完成就直接返回了response对象,此时回调里的赋值逻辑还没触发,所以永远返回默认的false。你后续写的when分支判断执行时,update任务还在运行中,状态未更新,因此始终触发else分支。

正确实现方案

你已经在协程环境中,且已经用到了Tasks.await()来同步执行Firestore操作,直接对update返回的Task也使用await即可,不需要额外设置回调,同时配合try-catch捕获异常处理失败场景:

import com.google.android.gms.tasks.Tasks
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext

suspend fun writeClientMemo(userId: String, memo: Memo): MemoWriteResponse {
    return withContext(Dispatchers.IO) {
        val response = MemoWriteResponse()
        val docRef = Firebase.firestore
            .collection(COLLECTION_USER)
            .document(userId)

        try {
            val getResult = Tasks.await(docRef.get())
            if (getResult.exists() && getResult.data != null) {
                Log.d("memo", "data exists ")
                // 直接await update操作的结果,同步等待执行完成
                Tasks.await(docRef.update(FIELD_MEMO_LIST, FieldValue.arrayUnion(memo)))
                // 执行到此处说明update成功
                response.isSuccessful = true
                Log.d("memo", "success")
            } else {
                // 可选处理:用户文档不存在的情况
                response.isSuccessful = false
                response.errorMessage = "用户文档不存在"
            }
        } catch (e: Exception) {
            // 捕获get或update过程中抛出的所有异常,处理失败场景
            Log.d("memo", "failed: ${e.toString()}")
            response.isSuccessful = false
            response.errorMessage = e.toString()
        }
        // 这里返回的是已经赋值完成的response
        return@withContext response
    }
}

补充说明

  • Tasks.await()会阻塞当前协程直到Task执行完成,如果Task执行失败会直接抛出对应的异常,所以用try-catch包裹即可统一处理所有失败场景,不需要额外设置OnSuccessListener和OnFailureListener
  • 所有Firestore的IO操作建议放到Dispatchers.IO调度器执行,避免阻塞主线程

内容的提问来源于stack exchange,提问作者c-an

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 15:24:03