【问题标题】:Async Action and Future异步操作和未来
【发布时间】:2016-05-24 12:00:33
【问题描述】:

我正在使用 Play 2.5 和 Scala 2.11。我正在尝试将 async Action 与 Future 一起使用以返回 json 字符串,但无法使其正常工作。 这是我的行动:

def getData = Action.async { implicit request =>
    val futureData = Future { daoObj.fetchData }
    futureData onComplete {
        case Success(data) =>
            Ok(Json.prettyPrint(Json.obj("data" -> data.groupBy(_.name))))
        case Failure(t) => 
            BadRequest(Json.prettyPrint(Json.obj(
                "status" -> "400",
                "message" -> s"$t"
            )))
    }
}

daoObj.fetchData 返回 scala.concurrent.Future[List[models.Data]]

这是模型。数据:

case class Data(name: String, details: String)

我可以有这样的数据

Data (name = "data1", details = "details1")
Data (name = "data1", details = "details1a")
Data (name = "data2", details = "details2")

我可以加入名称以返回表单的结构

Map(data1 -> List("details1", "details11"),
    data2 -> List("details2"))

我在 groupBy 上有一个编译错误:

value groupBy is not a member of scala.concurrent.Future[List[models.Data]]

1) 如何在我的操作中从 Future 获取值 (List[models.Data]) ?

2) 这是我的第一个 Play Scala 应用程序,所以如果您有任何意见可以改进我的代码,欢迎提出。

【问题讨论】:

  • 看起来您在daoObj.fetchData 周围多了一个Future{}。删除它。

标签: scala asynchronous playframework


【解决方案1】:

你不应该使用Future.onComplete,这是一个回调(有副作用),而是.map.recover将你的Future[T]变成Future[Result],这是Action.async所期望的。

def getData = Action.async { implicit request =>
  Future { daoObj.fetchData }.map { data =>
    Json.obj("data" -> data.groupBy(_.name))
  }.recover {
    case error => BadRequest(Json.obj(
      "status" -> "400",
      "message" -> error.getMessage
    ))
  }
}

不需要漂亮地打印JsObject,它可以直接写成结果(可能除了调试目的)。

【讨论】:

    猜你喜欢
    • 2018-05-18
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 2015-02-02
    相关资源
    最近更新 更多