2

我需要根据用户发布的数据生成各种代码片段,因此这些片段生成可以是并行的,我正在尝试为每个片段生成使用期货并将它们组合并发送 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))
    }
  }
}

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

4

1 回答 1

0

我没有看到一个明显的问题 - 尝试添加一个p onFailure { case e: Throwable => Logger.error("failed", e) }也许,看看它是否表明一个未来没有完成。

于 2013-06-01T04:18:26.850 回答