【Coroutines】Implement JavaScript Promise by Kotlin Coroutine

Expected

use async to launch a async task

use await to wait result from other work

async {
    val user = await<String> { loadUserInfo() }
    println(user)
    println("async returned")
}
println("async not return")
Implementation

async can implemented with startCoroutine

await can implemented with suspendCoroutine

package com.code.kotlin

import kotlin.coroutines.*

interface Promise<T> {
    fun resume(value: T)
    fun error(e: Throwable)
}

internal class PromiseImpl<T> : Promise<T>, Continuation<Unit> {

    override val context = EmptyCoroutineContext

    internal lateinit var continuation: Continuation<T>

    override fun resumeWith(result: Result<Unit>) {
        result.getOrThrow()
    }

    override fun resume(value: T) {
        continuation.resume(value)
    }

    override fun error(e: Throwable) {
        continuation.resumeWithException(e)
    }
}

fun <T> async(
    block: suspend Promise<T>.() -> Unit
): Promise<T> {
    val promise = PromiseImpl<T>()
    block.startCoroutine(promise, promise)
    return promise
}

suspend fun <T> Promise<T>.await(
    block: Promise<T>.() -> Unit
) = suspendCoroutine { continuation ->
    val impl = this as PromiseImpl<T>
    impl.continuation = continuation
    impl.block()
}
package com.code.kotlin

import kotlin.concurrent.thread

fun main() {
    async {
        val user = await<String> { loadUserInfo() }
        println(user)
        println("async returned")
    }
    println("async not return")
}

fun Promise<String>.loadUserInfo() {
    thread {
        Thread.sleep(3000L)
        try {
            resume("Darius")
        } catch (e: Throwable) {
            error(e)
        }
    }
}

await can wait result from both blocking code / async code / suspend code, only resume is called

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值