提问者:小点点

如何在最新的kotlin-Couroutine中使用扩展函数中的协程


在示例中:kotlin-example/coroutines/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-协程中,调用启动必须依赖于协程范围;因此不能在扩展函数Route. coroutineHandler()中调用启动;

如果总是使用GlobalScope.启动()来启动课程,如何正确管理生命周期?

所以我使用流动的方法:

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中使用扩展功能;


共1个答案

匿名用户

您可以通过添加以下扩展来实现这一点:

fun Route.suspendHandler(requestHandler: suspend (RoutingContext) -> Unit) {
  handler { ctx ->
    CoroutineScope(ctx.vertx().dispatcher()).launch {
      requestHandler(ctx)
    }.invokeOnCompletion {
      it?.run { ctx.fail(it) }
    }
  }
}

您可以将此扩展放在代码中的任何位置。