我正在使用公开了回调函数的第三方库。回调函数将在成功时调用。回调函数不是挂起函数,但是当我尝试在非挂起函数内部进行调用以返回挂起函数的结果时,该函数使用 aysnc 和 await 进行 IO 调用,调用永远不会被强制执行。下面我想出了一个简单的代码片段来演示这个问题。
open class TestVerticle: CoroutineVerticle() {
override suspend fun start() {
awaitBlockingExample()
}
fun awaitBlockingExample():String {
val future= async(vertx.dispatcher()) {
makeSuspendFunCall()
}
val result:String= runBlocking(vertx.dispatcher()){future.await()}
println(" The final Result is $result")
return result
}
suspend fun makeSuspendFunCall():String{
println("Comming here 3")
delay(500)
val resp="Test"
return resp
}
}
fun main(args: Array<String>) = runBlocking {
Vertx.vertx().deployVerticle("TestVerticle")
}
如果我删除 makeSuspendFunCall 中的延迟函数,程序运行良好,但如果我添加延迟函数,它会挂起。我实际上是在这里使用延迟函数模拟挂起函数网络调用。在这种情况下,如何从 awaitBlockingExample 获得结果?我清楚地明白,通过将 awaitBlockingExample 作为挂起函数,我可以完成这项工作并删除异步并在内部运行阻塞调用。但是这里 awaitBlockingExample (非挂起函数)代表了一个由本方库提供的实现,它在我们的实现中被覆盖。比如guava缓存提供了reload函数,我想重写reload函数(非挂起函数),并从reload方法中调用协程函数来刷新数据库或网络调用的缓存值。