(我没有包括进口,以免使这个问题混乱不堪)
(这是最简单的Scala应用程序(使用Typesafe Activator上的scala-minimal模板创建)
我正在尝试对Elasticsearch Server运行查询。
我已经在 sbt控制台上运行了相同的代码,并且可以看到正确的结果。
但是,当我运行以下代码时,我看到"END"
(回调之后的代码)被打印,但是Success回调和Failure回调都没有运行。
我是Scala新手,所以也许我在这里做错什么了? 编译此代码。 (只是让您知道所有导入都在那里)
object Hello{
def main(args: Array[String]): Unit = {
val client = ElasticClient.remote("vm-3bsa", 9300)
val res:Future[SearchResponse] = client.execute{ search in "vulnerabilities/3bsa" query "css" }
res onComplete{
case Success(s) => println(s)
case Failure(t) => println("An error has occured: " + t)
}
println("END")
//EDIT start
Await.result(res,10.seconds)
//EDIT end
}
}
最终编辑
如果我改为打印
onComplete
的调用结果,则可以使用它而不是Await.result
:val await=Await.result(res,10.seconds)
println(await)
// results shown
最佳答案
主线程将注册您的onComplete
,println("END")
,然后退出,这使程序终止,因此您永远不会看到onComplete回调。
您可以使用Await.result(future, timeout)
阻止主线程,使其保持 Activity 状态,直到答案到来为止。在服务器环境中,这是一个很大的禁忌,但在这样的小型应用程序中,阻塞一个线程不是问题。
关于scala - 似乎无法让Future在Scala中运行回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24767088/