3

データを処理するための既存のJavaクラスがあります。最初のpromiseからObjectNodeを使用して、Scala Asyncアクションでより多くの処理を行うにはどうすればよいですか?

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 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 ドキュメントの 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")))
    )
  }
}
于 2013-02-28T10:32:32.933 に答える