为何我的Scala+SQLite代码无法返回查询结果?
问题原因与解决方案
问题根源
你的代码里,db.run(screenings.result)返回的是异步Future,onComplete是异步回调逻辑。但主线程执行完println("Screenings")后就直接退出了,根本没等Future的回调代码执行——这就是为什么你看不到"completed"输出的原因。前面的setupFuture用了Await.result阻塞等待执行完成,但后面的查询操作没有做任何等待,进程直接结束。
解决方法
有两种简单的方式让主线程等待异步查询完成:
方式一:用Await.result阻塞获取结果
把异步查询改成阻塞等待,和初始化操作一样:
println("Screenings") val resultFuture = db.run(screenings.result) try { val results = Await.result(resultFuture, 20.second) println("completed") results.foreach(println) } catch { case e: Exception => println(s"An error has occurred: ${e.getMessage}") }
方式二:用Await.ready等待Future执行完成
如果不想获取结果,只是等待回调执行,可以用Await.ready:
println("Screenings") val resultFuture = db.run(screenings.result).onComplete { case Success(results) => println("completed") results.foreach(println) case Failure(exception) => println(s"An error has occurred: ${exception.getMessage}") } // 等待Future执行完成,最长等20秒 Await.ready(resultFuture, 20.second)
额外说明
在实际的后端服务(比如Play、Akka应用)中,不需要手动用Await,因为服务本身会保持主线程运行。但在这种控制台测试程序里,必须显式等待异步任务完成,否则进程会提前终止。
内容的提问来源于stack exchange,提问作者Ni3dzwi3dz
相关产品推荐
相关产品推荐

