我有一个用于处理数据的现有java类。我如何使用第一个承诺中的ObjectNode以及我的Scala异步操作中的更多处理?
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
}
答案 0 :(得分:4)
我假设您正在关注Play documentation guide,对吧?
首先,请注意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 documentation example中,intensiveComputation()
会直接返回值(即ObjectNode
),而您的版本会返回保存该值的未来(即Future<ObjectNode>
})。
其次,在你的futureInt.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")))
)
}
}