Scala future.onComplete的函数返回类型错误
我正在使用Scala 我有一个返回对象的方法,在这个方法中,我使用future和OnComPete回调Scala future.onComplete的函数返回类型错误,scala,callback,future,Scala,Callback,Future,我正在使用Scala 我有一个返回对象的方法,在这个方法中,我使用future和OnComPete回调 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]]
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
}
问题是当我运行代码时,它会在控制台上打印出这个函数为空的对象的名称
请帮帮我 问题在于,在
xyzFunction
完成之前,未来还没有完成。这意味着未设置abcObj
(在未来.onComplete
块中),因此它仍然等于其初始值(从行var abcObj=new Abc
)
为确保xyzFunction
为abcObj
返回有效值,您可以等待将来完成(例如通过wait.result(future,timeoutValue)
)
不过,更好的方法是返回一个
未来[Abc]
,将结果链接为未来(使用map
、flatMap
,以及类似的方法),一路向上,并尽可能晚地解析。例如,如果使用Play框架,请使用Action.async
,让Play在内部为您解决未来问题。问题在于,在xyzFunction
完成之前,未来还没有完成。这意味着未设置abcObj
(在未来.onComplete
块中),因此它仍然等于其初始值(从行var abcObj=new Abc
)
为确保xyzFunction
为abcObj
返回有效值,您可以等待将来完成(例如通过wait.result(future,timeoutValue)
)
不过,更好的方法是返回一个
未来[Abc]
,将结果链接为未来(使用map
、flatMap
,以及类似的方法),一路向上,并尽可能晚地解析。例如,如果使用Play框架,请使用Action.async
,让Play在内部为您处理解决未来的问题。我想我可以使用Try来解决这个问题,如果我这样做,val future:future[Try[MutableList[Abc]],然后我可以使用map函数和future-like-future-map{case Success=>{//code}case failure=>{//code}}你认为这有什么意义?而且我没有使用Play,所以我必须找到另一个way@M.AhsenTaqi这在很大程度上取决于“{//code}”块中发生的事情,以及返回类型。我的建议是从这个函数和尽可能多的其他函数中返回Future[Abc]
(或者更一般地说,对于一些合适的X,返回Future[X]
),留下一个小的顶级内核,实际等待未来完成(无论是播放操作、web服务调用的端点、应用程序的主要方法、其中的引擎循环,还是其他合适的方式)@M.AhsenTaqi尝试将您的函数看作是为应该发生的事情构建一个脚本(而不是在函数中实际做工作),该脚本只在“末端”执行-通常在提供任何输出之前(打印语句、文件写入、HTTP回复或其他)。我想我可以使用val future:future[Try[MutableList[Abc]]]来解决这个问题,如果我这样做的话,然后我可以使用map函数和future-like future-map{case Success=>{//code}case failure=>{//code}你认为这有什么意义?而且我没有使用Play,所以我必须另找一个way@M.AhsenTaqi这在很大程度上取决于“{//code}”块中发生的情况以及返回类型。我的建议是返回Future[Abc]
(或者更一般地说,对于一些合适的X,返回Future[X]
)从这个函数和尽可能多的其他函数中,留下一个小的、顶级的内核,实际等待将来完成(无论是播放操作、web服务调用的端点、应用程序的主方法、其中的引擎循环,还是其他合适的).@M.AhsenTaqi尝试将您的函数看作是为应该发生的事情构建一个脚本(而不是在函数中实际执行工作),该脚本仅在“结束”时“执行”——通常在提供任何输出(打印语句、文件写入、HTTP回复或其他内容)之前执行。