Как использовать сопрограмму в рамках функции расширения в последней kotlin -программе - PullRequest
0 голосов
/ 08 апреля 2020

В примере: 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 сопрограммы;

...