Scala future.onComplete的函数返回类型错误

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]]

我正在使用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]]
        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回复或其他内容)之前执行。