有没有一种方法可以编写下面的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时,该代码可以编译并正常运行。但是编译目标为JavaScript时会发出编译错误,原因是runBlocking函数不存在。
GlobalScope
在kotlinx.coroutines.experimental
中,因此它必须在任何平台上都可用,但我不知道它是否是 JS 上的最佳选择。您无法避免使用suspend
和启动协程,因为这就是其工作原理的本质。 - Marko Topolnikkotlinx-coroutines-experimental
版本0.26
编写的。它弃用了几个关键机制,比如没有接收器的全局launch
。 - Marko Topolnik