Get data from Callback using Coroutine 🧠
3 great ways to get data from a callback using a coroutine
2 min readJul 8, 2021
0️⃣ Define a result class:
sealed class Result<T> {
data class Success<T>(val result: T) : Result<T>()
data class Failure<T>(val error: Throwable) : Result<T>()
}
FOREWORD: example based on Firebase Auth Send SignIn Link and DataStore.
1️⃣ FIRST method — just getting data from a callback:
override suspend fun sendSignInLinkToEmail(
email: String,
actionCodeSettings: ActionCodeSettings
) = suspendCoroutine<Result<Boolean>> { continuation ->
auth.sendSignInLinkToEmail(email, actionCodeSettings)
.addOnSuccessListener { continuation.resume(Result.Success(true)) }
.addOnFailureListener { continuation.resume(Result.Failure(it)) }
}
2️⃣ SECOND method — get data from callback with cancellation option:
override suspend fun sendSignInLinkToEmail(
email: String,
actionCodeSettings: ActionCodeSettings
) = suspendCancellableCoroutine<Result<Boolean>> { continuation ->
auth.sendSignInLinkToEmail(email, actionCodeSettings)
.addOnSuccessListener { continuation.resume(Result.Success(true)) }
.addOnFailureListener { continuation.resume(Result.Failure(it)) }
}
RECOMMENDATION: suspendCoroutine VS suspendCancelableCoroutine always use — suspendCancelableCoroutine.
3️⃣ THIRD method — get data from callback with the ability to run suspend functions:
PS. Vel_daN: Love what You DO 💚.