Firebase到协程的异步任务

时间:2019-03-25 08:07:20

标签: android kotlin firebase-authentication kotlin-coroutines

我已经使用了暂停例程生成器使Firebase Tasks从基于异步侦听器的代码转移到基于协程的代码。

这是我的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为null。在这种情况下,应该将什么传递给continuation.resume?。

1 个答案:

答案 0 :(得分:1)

您的返回类型应该为空,因为Task.getResult()为空:

suspend fun <T> Task<T>.await() : T? = ...

如果使用它来获取不可为空的结果,请在使用站点而不是在实现内部强制实施不可为空。

但是,当kotlinx-coroutines-play-services中已经定义了它时,为什么还要麻烦重新实现呢?