Get data from Callback using Coroutine 🧠

3 great ways to get data from a callback using a coroutine

Vladislav Shesternin
2 min readJul 8, 2021

0️⃣ Define a result class:

Result
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:

suspendCoroutine
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:

suspendCancelableCoroutine
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:

CompletableDeferred

PS. Vel_daN: Love what You DO 💚.

--

--