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

如何避免Datastore读取与Retrofit接口调用的协程竞态条件?

协程调用顺序与竞态条件问题解答

你的代码完全不会产生竞态条件,调用顺序是绝对可靠的,原因如下:

  • getUnits是挂起函数,其中dataStore.readStringDataStore(UNITS_KEY).first()会挂起当前协程,直到从Datastore拿到第一个结果才继续执行,所以getUnits必须等获取到单位数据后才会返回值。
  • 在viewModelScope.launch的协程块里,val units = getUnits()这行执行时,协程会暂停在这里,直到getUnits返回结果,之后才会执行后面的Retrofit网络请求。

简单说,协程里的挂起函数是顺序执行的,前一个挂起操作完成前,后面的代码不会执行,所以你的依赖逻辑完全成立。

另外可以把getUnits的代码简化得更简洁:

private suspend fun getUnits(): Units {
    return dataStore.readStringDataStore(UNITS_KEY).first()
        ?.let { Units.valueOf(it) }
        ?: Units.FAHRENHEIT
}

内容的提问来源于stack exchange,提问作者Kenny Sexton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 00:44:53