2

有没有办法编写下面的 Kotlin 代码,以便它在 JVM 和 JavaScript 上以相同的方式编译和工作?

fun <A: Any> request(request: Any): A  = runBlocking {
    suspendCoroutine<A> { cont ->
        val subscriber = { response: A ->
                cont.resume(response)
        }
        sendAsync(request, subscriber)
    }
}


fun <Q : Any, A : Any> sendAsync(request: Q, handler: (A) -> Unit) {

    // request is sent to a remote service,
    // when the result is available it is passed to handler(... /* result */)

}

当编译为针对 JVM 时,代码可以编译并正常工作。由于函数 runBlocking 不存在,以 JavaScript 为目标时会发出编译错误

4

1 回答 1

3

你的主要问题是你没有要求你真正需要的东西。您编写的代码启动一个协程,暂停它,然后阻塞直到它完成。这完全等同于根本没有协程,而只是发出阻塞的网络请求,这是您不可能期望 JavaScript 允许的。

您实际上需要做的是退回到调用站点request()并将其包装在launch

GlobalScope.launch(Dispatchers.Default) {
    val result: A = request(...)
    // work with the result
}

有了这个,您可以将您的请求函数重写为

suspend fun <A: Any> request(request: Any): A = suspendCancellableCoroutine {
    sendAsync(request, it::resume)
}
于 2018-09-19T08:41:27.190 回答