【发布时间】:2021-02-26 00:06:34
【问题描述】:
具有两个数据源(本地和远程)的存储库,我请求在初始化时从两个源获取 accessToken。来自本地和远程的函数都返回一个我试图在初始化中收集的流。但只有第一个收集成功运行,而另一个则没有。这是为什么?有没有一种干净的方式来处理这种用例?
private suspend fun init() {
refreshAccessTokenFromLocal()
refreshAccessTokenFromNetwork()
}
private suspend fun refreshAccessTokenFromNetwork() {
networkDataSource.refreshAccessToken()
.collect { accessToken ->
Timber.d("Debug: refreshing accessToken from network $accessToken")
localDataSource.updateAccessToken(accessToken)
}
}
private suspend fun refreshAccessTokenFromLocal() {
localDataSource.getAccessToken().collect { accessToken ->
Timber.d("Debug: refreshing accessToken from local $accessToken")
accessTokenAsStateFlow.value = accessToken
}
}
【问题讨论】:
-
可能是 Flow 实现。第一个 Flow 完成了吗?在取消之前,流可以设计为有限或无限的。如果你只想要一个 Flow 中的一个值,你可以使用
first()而不是collect(),然后如果 Flow 是无限的,它就不会永远运行。