【问题标题】:Function return type error with future.onCompletefuture.onComplete 函数返回类型错误
【发布时间】:2015-11-17 18:41:02
【问题描述】:

我正在使用 Scala

我有一个返回对象的方法,在这个方法中,我将 future 与 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 这个函数为空的对象

请帮帮我!

【问题讨论】:

    标签: scala callback future


    【解决方案1】:

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

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

    不过,更好的方法是返回 Future[Abc],将结果链接为期货(使用 map、flatMap 和类似方法)一直向上并尽可能晚地解析。例如,如果使用 Play 框架,请使用 Action.async 并让 Play 在内部为您处理解析未来。

    【讨论】:

    • 我想我可以使用尝试解决这个问题,如果我这样做,val future:Future[Try [MutableList[Abc]]] 然后我可以使用未来地图的地图功能{ case Success => {//code } case failure => {//code } } 你觉得这有什么意义?
    • 我没有使用 Play,所以我必须找到另一种方式
    • @M.AhsenTaqi 这将在很大程度上取决于“{//code}”块中发生的事情以及您的返回类型是什么。我的建议是从这个函数和尽可能多的其他函数中返回Future[Abc](或者更一般的Future[X]),留下一个小的顶层核心,实际上等待未来完成(无论是 Play 操作、Web 服务调用的端点、应用程序的 main 方法、其中的引擎循环,还是任何适当的)。
    • @M.AhsenTaqi 试着把你的函数想象成为应该发生的事情构建一个脚本(而不是在函数中实际执行工作),该脚本仅在“结束”时“执行” " - 通常在提供任何输出之前(打印语句、文件写入、HTTP 回复或其他)。
    猜你喜欢
    • 2019-12-12
    • 1970-01-01
    • 2020-07-17
    • 2014-01-02
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    相关资源
    最近更新 更多