![](/img/trans.png)
[英]How to measure execution time of a particular block of code in Cloud Function for Firebase?
[英]How to block a suspend function that is calling firebase
在我的AuthRepository
,我试图创建一个将在主线程中异步运行的login
function,我使用 firebase auth 来执行此操作,并使用sealed class AuthResult
来处理结果 state。
我的问题是,当我尝试返回AuthResult
state 时,它将是 null 因为我在.addOnCompleteListener
完成之前返回了var authResult: AuthResult = null
变量...
这是我的 function:
override suspend fun login(email: String, password: String): AuthResult {
return try {
var authResult: AuthResult? = null
firebaseAuth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener { task ->
if (task.isSuccessful) {
task.result.user?.let {
authResult = AuthResult.Success(it)
}
} else {
// exception
authResult = AuthResult.Error(message = "An error occurred", task.exception)
}
}
authResult ?: AuthResult.Error(message = "An error occurred null")
} catch (e: Exception) {
AuthResult.Error("An error has occurred", e)
}
}
我在我的LoginViewModel
中使用 invoke usecase 调用这个 function :
private val _state = MutableStateFlow<AuthResult?>(null)
val state: StateFlow<AuthResult?> = _state
fun login(email: String, password: String) {
viewModelScope.launch(Dispatchers.IO) {
_state.value = loginUseCase(email, password)
}
}
所以考虑到我的问题state
将是:
AuthResult.Error(message = "An error occurred null")
我试图完成的是阻止suspend fun login(...)
直到.addOnCompleteListener{}
完成...
缺少依赖项,所以我无法使用await()
:
添加这个:
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.6.0'
然后在.addOnCompleteListener {}
之后添加.await()
:
firebaseAuth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener { task ->
...
}.await()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.