函数返回类型错误,包含future.onComplete

时间:2015-08-24 10:58:31

标签: scala callback future

我正在使用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此函数为空的对象

请帮助我!

1 个答案:

答案 0 :(得分:4)

问题是,在xyzFunction完成之前,未来还没有完成。这意味着abcObj尚未设置(在future.onComplete块中),因此它仍然等于其初始值(来自行var abcObj = new Abc)。

为确保xyzFunction返回abcObj的有效值,您可以等待将来完成(例如,通过Await.result(future, timeoutValue))。

但更好的方法是返回Future[Abc],将结果链接为期货(使用mapflatMap和类似方法)一直到最后一行并解决为时已晚尽可能。例如,如果使用Play框架,请使用Action.async并让Play在内部为您解决未来。