В примере: kotlin - примеры / сопрограммы / src / main / kotlin / movierating / App.kt Есть текущий код:
fun Route.coroutineHandler(fn: suspend (RoutingContext) -> Unit) {
handler { ctx ->
launch(ctx.vertx().dispatcher()) {
try {
fn(ctx)
} catch (e: Exception) {
ctx.fail(e)
}
}
}
}
В последнем kotlin -программа, запуск запуска должен зависеть от CoroutineScope; Поэтому запуск не может быть вызван в функции расширения Route.coroutineHandler ();
Если всегда использовать GlobalScope.launch () для запуска процедуры, как правильно управлять жизненным циклом?
Поэтому я использую текущий метод:
interface SuspendHandler<E>: Handler<E>,CoroutineScope {
override fun handle(event: E) {
launch {
suspendHandle(event)
}
}
suspend fun suspendHandle(event: E)
}
fun <E> vertxSuspendHandler(vertx: Vertx = getDefaultVertx(),
block:suspend CoroutineScope.(E)->Unit): SuspendHandler<E>{
return object: SuspendHandler<E> {
override val coroutineContext: CoroutineContext
get() = vertx.dispatcher()
override suspend fun suspendHandle(event: E) {
block(event)
}
}
}
Я не знаю, как использовать функцию расширения в последнем API сопрограммы;