我正在使用Scala
我有一个返回对象的方法,在这个方法中我使用的是onComlpete回调
def xyzFunction (id : Int) : Abc = {
var abcObj = new Abc
var RetunedLists = new MutableList[ArtistImpl]()
val future:Future[MutableList[Abc]] = ask(SomeActor,Message(id)).mapTo[MutableList[Abc]]
future.onComplete {
case Success(result) =>
RetunedLists = result
abcObj = RetunedLists.get(0)
println("name : " + abcObj.name)
case Failure(e) =>
println("printStackTrace"+e.printStackTrace)
}
abcObj
}
问题是,当我运行代码时,它在控制台上打印名称bt此函数为空的对象
请帮助我!答案 0 :(得分:4)
问题是,在xyzFunction
完成之前,未来还没有完成。这意味着abcObj
尚未设置(在future.onComplete
块中),因此它仍然等于其初始值(来自行var abcObj = new Abc
)。
为确保xyzFunction
返回abcObj
的有效值,您可以等待将来完成(例如,通过Await.result(future, timeoutValue)
)。
但更好的方法是返回Future[Abc]
,将结果链接为期货(使用map
,flatMap
和类似方法)一直到最后一行并解决为时已晚尽可能。例如,如果使用Play框架,请使用Action.async
并让Play在内部为您解决未来。