Firebase 异步任务到协程
Firebase async tasks to coroutines
我已经使用挂起例程构建器使 Firebase 任务从基于异步侦听器的代码转移到基于协程的代码。
这是我的 suspendcoroutine,我通过它实现协程行为。
suspend fun <T> Task<T>.awaitTask(): T =
suspendCoroutine { continuation ->
addOnCompleteListener { task ->
if (task.isSuccessful) {
continuation.resume(task.result!!)//what to do if task.result is null
} else {
continuation.resumeWithException(task.exception!!)
}
}
}
这就是我调用它的方式
firebase.createUserWithEmailAndPassword(userCredentials.email!!, userCredentials.password!!).awaitTask()
一切正常,直到我们执行一个可能出现空结果的任务。像 。
firebase.currentUser?.updateProfile(profileUpdates)?.awaitTask()
此处更新成功后,task.result为空。在那种情况下,应该将什么传递给 continuation.resume?.
您的 return 类型应该可以为空,因为 Task.getResult()
可以为空:
suspend fun <T> Task<T>.await() : T? = ...
如果您使用它来获得不可为空的结果,则在使用站点而不是在实现内部强制执行不可为空性。
但是,既然它已经在 kotlinx-coroutines-play-services
中定义了,为什么还要重新实现它呢?
我已经使用挂起例程构建器使 Firebase 任务从基于异步侦听器的代码转移到基于协程的代码。
这是我的 suspendcoroutine,我通过它实现协程行为。
suspend fun <T> Task<T>.awaitTask(): T =
suspendCoroutine { continuation ->
addOnCompleteListener { task ->
if (task.isSuccessful) {
continuation.resume(task.result!!)//what to do if task.result is null
} else {
continuation.resumeWithException(task.exception!!)
}
}
}
这就是我调用它的方式
firebase.createUserWithEmailAndPassword(userCredentials.email!!, userCredentials.password!!).awaitTask()
一切正常,直到我们执行一个可能出现空结果的任务。像 。
firebase.currentUser?.updateProfile(profileUpdates)?.awaitTask()
此处更新成功后,task.result为空。在那种情况下,应该将什么传递给 continuation.resume?.
您的 return 类型应该可以为空,因为 Task.getResult()
可以为空:
suspend fun <T> Task<T>.await() : T? = ...
如果您使用它来获得不可为空的结果,则在使用站点而不是在实现内部强制执行不可为空性。
但是,既然它已经在 kotlinx-coroutines-play-services
中定义了,为什么还要重新实现它呢?