3

我有一个用于处理数据的现有 java 类。如何在我的 Scala 异步操作中使用第一个承诺中的 ObjectNode 以及更多处理?

public class JavaClass extends Controller {
  public static Promise<ObjectNode> intensiveComputation(String imageId) {
  }
}


def index = Action {
  val futureInt = scala.concurrent.Future { JavaClass.intensiveComputation() }
  Async {
    futureInt.map(promise => 
      var objJs = promise.GetObjectNodeFromPromise()
      (objJs \ Config.RESP_STATUS_PARAM).as[String] match {
        // I WANT TO READ ObjectNode from promise and do more works here
      }
      Ok(Json.toJson(Map("status" -> "ok")))
  }
}

编辑 1

我尝试使用@hbf 代码,但是,在这一行出现编译错误。

[error]  found   : org.codehaus.jackson.node.ObjectNode => play.api.mvc.SimpleResult[play.api.libs.json.JsValue]
[error]  required: play.libs.F.Function[org.codehaus.jackson.node.ObjectNode,?]
[error]                 var result = futureObj map { objJs: ObjectNode =>

如果我从 objJs 中删除 ObjectNode,我会收到此错误。

[error]  missing parameter type
[error]                 var result = futureObj map { objJs =>

新代码

def index = Action {
  val futureInt = JavaClass.intensiveComputation()
  Async {
    var result = futureObj map { objJs: ObjectNode =>
      Ok(Json.toJson(Map("status" -> "ok")))
    }
    result
}
4

1 回答 1

4

我假设您正在遵循Play 文档指南,对吗?

首先,请注意 Play 现在(从 2.1 版开始)使用 Scala 期货,因此,命名法发生了变化:您的方法intensiveComputation()返回一个 (Scala) Future<ObjectNode>(而在 2.1 之前的版本中,它被称为Promise<ObjectNode>)。

public class JavaClass extends Controller {
  public static Future<ObjectNode> intensiveComputation(String imageId) {
    /* ... */
  }
}

另请注意,在Play 文档示例中,直接intensiveComputation()返回值(即ObjectNode),而您的版本返回保存该值的未来(即Future<ObjectNode>)。

其次,在 yourfutureInt.map中,闭包接收未来的价值,而不是未来本身。所以尝试类似:

def index = Action {
  val futureInt = JavaClass.intensiveComputation() // I's already a future!
  Async {
    futureInt.map(objJs => // `objJs` is the result of `intensiveComputation`
      // Extract from `objJs` whatever you need ...
      // ... and make the `Ok` call here (and not outside)
      Ok(Json.toJson(Map("status" -> "ok")))
    )
  }
}
于 2013-02-28T10:32:32.933 回答