目标 JavaScript 时在 Kotlin 协程中使用 runBlocking?
Using runBlocking in Kotlin Coroutines when targeting JavaScript?
有没有办法编写下面的 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 为目标时会发出编译错误
你的主要问题是你没有要求你真正需要的东西。您编写的代码启动协程,暂停它,然后阻塞直到它完成。这完全等同于根本没有协程,只是发出一个阻塞网络请求,这是你不可能期望 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)
}
有没有办法编写下面的 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 为目标时会发出编译错误你的主要问题是你没有要求你真正需要的东西。您编写的代码启动协程,暂停它,然后阻塞直到它完成。这完全等同于根本没有协程,只是发出一个阻塞网络请求,这是你不可能期望 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)
}