播放2.1 Scala连锁多个期货和承诺

时间:2013-02-28 10:11:11

标签: scala future playframework-2.1 promise

我有一个用于处理数据的现有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
}

1 个答案:

答案 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")))
    )
  }
}