azabost
07/28/2021, 6:38 PMsuspendCancellableCoroutinesuspend fun displayFoo() {
    val foo = getFoo()
    delay(10_000)
    println(foo)
}
suspend fun getFoo(): Foo = suspendCancellableCoroutine { continuation ->
    val callback = FooLoader
        .addListener(object : RequestListener<Foo> {
            override fun onLoadFailed(e: FooException): Boolean {
                continuation.resumeWithException(e)
                return false
            }
            override fun onLoadSuccessful(foo: Foo): Boolean {
                continuation.resume(foo)
                return false
            }
        })
        .load()
    continuation.invokeOnCancellation {
        callback.cancel()
    }
}onLoadSuccessfuldelay(10_000)return falsedelaysuspend fun displayFoo() {
    val foo = getFoo()
    delay(10_000)
    throw NPE
}Nick Allen
07/28/2021, 7:08 PMcontinuation.resume(foo)Nick Allen
07/28/2021, 7:22 PMsuspendCancellableCoroutinedelay(10_000)println(foo)Nick Allen
07/28/2021, 7:31 PM