【问题标题】:Scala Play framework-2.1.1 AsyncResult: Handling multiple futuresScala Play framework-2.1.1 AsyncResult:处理多个期货
【发布时间】:2013-06-01 03:30:14
【问题描述】:

我需要根据用户发布的数据生成各种代码 sn-ps,所以这些 sn-p 生成可以是并行的,我正在尝试为每个和 sn-p 生成使用期货并将它们组合并发送 AsyncResult,这里是代码

val p = for {
  pr <- Future { ProviderGenerator.generate(content) }
  c <- Future { ModelGenerator.generate(content) }
} yield(pr, c)

Async {
  if (p.isCompleted)
    println("Futures completed")
  p.onSuccess({
    case (pr: ActionResult, c: ActionResult) => {
      response.add(pr)
      response.add(c)
      Ok(Json.toJson(response))
    }
  })
  p onFailure {
    case _ => println("It failed")
  }
  p.map {
    case (pr: ActionResult, c: ActionResult) => {
      println("I am in case")
      response.add(pr)
      response.add(c)
      Ok(Json.toJson(response))
    }
    case _ => {
      println("I am in else case")
      Ok(Json.toJson(response))
    }
  }
}

这永远不会向用户发送结果,就好像我在其中使用单个未来一样,我得到了响应。我该如何处理这样的多个期货?

【问题讨论】:

    标签: scala playframework


    【解决方案1】:

    我没有发现明显的问题 - 尝试添加 p onFailure { case e: Throwable =&gt; Logger.error("failed", e) } 看看是否表明未来尚未完成。

    【讨论】:

    • 是的,我的代码中有失败代码sn-p,但为了缩短要求,我没有在这里添加它。无论如何,我编辑了我的问题以显示我所做的一切。这两起案件都没有被执行。我看不到任何印刷品
    • 如果其中一个 generate() 没有完成(只是无限期地阻塞),那么这些打印都不会到达......您可能会在更早的时候添加更多打印以尝试找出卡住的确切内容.
    • 由于某些未知原因,第二个未来没有被调用。那就是生成器函数没有被调用。改变了调用生成器的方式,然后它开始工作了。
    • 你提到的 pont 帮助我发现了问题。谢谢你。我真正的疑问是,这是处理多个并行事件的正确方法还是有更好的方法来处理此类情况?
    • 这里的 for() 语法将扩展为 Future { ProviderGenerator.generate() } flatMap { _ =&gt; Future { ModelGenerator.generate() } } 我相信...(加上构建元组)...所以第二个未来不会开始,直到第一个完成成功——这对于导致一系列期货按顺序执行通常很有用,但在这里可能不是你想要的。您可以先启动并保存两个中间期货,例如 val prFuture = Future { },然后使用 for 来提取 for { pr &lt;- prFuture; c &lt;- cFuture } yield (pr, c)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多