Использование runBlocking в Kotlin Coroutines при ориентации на JavaScript? - PullRequest
0 голосов
/ 18 сентября 2018

Есть ли способ написать код 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

1 Ответ

0 голосов
/ 19 сентября 2018

Ваша главная проблема в том, что вы не просите то, что вам действительно нужно.Код, который вы написали, запускает сопрограмму, приостанавливает ее, а затем блокирует, пока это не будет сделано.Это абсолютно равносильно отсутствию сопрограмм и простому блокированию сетевого запроса, чего вы не можете ожидать от 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)
}
...