挂起函数提前返回问题:Firebase异步上传无法获取正确DocumentId
问题修复方案
问题根源
你在挂起函数内通过CoroutineScope(Dispatchers.IO).launch启动了一个独立协程,但当前挂起函数不会等待这个协程执行完毕就直接返回了初始的空字符串,导致结果不符合预期。
修复代码(顺序执行版本)
suspend fun profileLiked(): String { return supervisorScope { try { // 等待第一个上传任务完成 async { firstFunctionToUploadAysnchronouslyToFirebase() }.await() // 执行第二个上传任务并返回其生成的documentId async { secondFunctionToUploadAsynchronouslyToFirebase() }.await() } catch (error: Exception) { throw error } } }
简化优化版(无需并行时)
如果两个上传任务不需要并行执行,直接按顺序调用挂起函数即可,代码更简洁:
suspend fun profileLiked(): String { return try { firstFunctionToUploadAysnchronouslyToFirebase() secondFunctionToUploadAsynchronouslyToFirebase() } catch (error: Exception) { throw error } }
关键改动说明
- 移除了手动创建的
CoroutineScope(Dispatchers.IO).launch:挂起函数本身运行在协程上下文中,无需额外启动独立协程,supervisorScope会自动等待内部所有逻辑执行完成后再返回结果。 - 直接返回第二个任务的结果:不需要额外的
documentId变量,避免了异步赋值导致的时序问题。 - 保留异常处理:确保上传过程中的异常能正常抛出,方便上层处理。
内容的提问来源于stack exchange,提问作者GVG
相关产品推荐
相关产品推荐

