当前位置: 首页 > 知识库问答 >
问题:

从协程/挂起函数创建“Uni”

宰父学
2023-03-14

我们使用夸克斯来处理在常规函数上运行的消息,因为我们基本上必须调用挂起函数

fun process (msg:Message):Message{
    val resFrom:Data = runBlocking{fetchDataFromDB(msg.key)}
    val processedMsg = processRoutingKey(msg,resFrom)
    return processedMsg

}

我们希望以Uni的形式获取数据(https://smallrye.io/smallrye-mutiny/getting-started/creating-unis)所以基本上我们想回去

fun process (msg:Message){
    val resFrom:Uni<Data> = ConvertUni {fetchDataFromDB(msg.key)}
}

我们需要进一步下游的uni一次来处理一些数据,但我们想从方法含义返回Uni

fun process (msg:Message):Uni<Message>{
    val resFrom:Uni<Data> = ConvertUni {fetchDataFromDB(msg.key)}
    val processed:Uni<Message> =process(msg,resfrom) 
    return processed 

}

共有1个答案

子车心思
2023-03-14

签名fun过程(消息:Message):Uni

在协程世界中,这意味着您需要启动协程。但是,与任何异步机制一样,它要求您意识到它将在哪里运行以及运行多长时间。这由您用来启动协程的CoroutineScope定义,这就是为什么async等协程构建器需要这样的范围。

因此,如果希望函数启动一个持续时间比函数调用长的协同例程,则需要将一个协同例程作用域传递给函数:

fun CoroutineScope.process(msg:Message): Uni<Message> {
    val uniResult = async { fetchDataFromDB(msg.key) }.asUni()
    return process(msg, uniResult) 
}

此处<代码>延迟

接受CoroutineScope作为接收器意味着方法的调用者可以选择此协程的范围,这将在适当时自动取消协程,并且还将定义运行协程的线程池/事件循环。

现在,考虑到这一点,您会看到您将在同一级别的API中混合使用协程和Uni,这不是很好。我建议一直坚持挂起函数,直到您真的必须转换为Uni

 类似资料:
  • 我正在尝试从 Java 7 调用科特林函数。我正在使用协程,这个被调用的函数正在挂起,例如: 我在版本 0.25.3 中使用了协程,我可以通过传递继续来模拟简单的 Java 回调样式 ,但是我使用的是Android,这意味着只使用Java 7。另一方面,简单的< code>Future太愚蠢了,因为我不想定期检查函数是否完成——我只想在函数完成时被调用。我真的希望避免添加新的库或许多额外的类/方法

  • 当我尝试使用读取此pod的日志时,它不会返回任何内容。如何查看日志以了解状态为“挂起”的原因?

  • 我正在阅读Kotlin Coroutine并且知道它是基于函数的。但是是什么意思呢? Coroutine或函数挂起? 摘自https://kotlinlang.org/docs/reference/coroutines.html 哪一个被停职了? 摘自https://kotlinlang.org/docs/reference/coroutines.html 为了继续类比,await()可以是一个挂

  • 我正在尝试使用为我的Java应用程序创建安装程序。我在Windows10上使用OpenJDK15.0.1。我应该能够使用 更新:我最初发布的问题发生在我使用--app image选项时,但它只使用基本命令。 这运行时没有错误,但生成的可执行文件无法完成。当我运行它时,一个窗口会短暂弹出并在我有时间阅读它之前消失,然后再也不会发生任何事情。它永远不会问“你想允许这个应用程序进行更改吗?”。然后,如果

  • 我在nodeJS中有一个主要的谷歌云功能。在这个函数中,我希望通过编程在同一个项目中创建另一个云函数。这个新的云函数的代码可以存储在谷歌云存储的zip文件中。我试着跟着这里的导游走:https://cloud.google.com/functions/docs/reference/rest/v1/projects.locations.functions/create 我能够在测试模拟器中运行查询,

  • 我已经创建了一个图形用户界面刮板(Qt和Python),它运行多个线程...图形用户界面似乎挂起,直到所有线程都产生...我运行刮板与喜欢200-300线程...一种在创建线程时阻止应用程序不响应的方法... 我在主线程中创建了一个新的Python线程,然后在下面的代码中调用QThread类中的线程