1

私は scala ディスパッチ (0.11.0) ライブラリを使用して、HTTP GET 要求をリモート サーバーに送信しています。リクエストに続くコードを実行する前に、レスポンスを待ちたいです。

私のリクエストは次の形式です。

val req = :/("myurl.com") <:< myheaders OK as.Response(identity)

私が書く場合:

val future = http(req)
future()
var res: String = null
future onComplete {
    case Success(r) => res = r.getResponseBody
    case _ => println("KO")
}
println(res)

私はヌルになります。これは、次のように書いた場合にも当てはまります。

val future = http(req)
var res: String = null
while (!future.isCompleted) {
    Thread.sleep(1000)
}
future onComplete {
    case Success(r) => res = r.getResponseBody
    case _ => println("KO")
}
println(res)

しかし、次のコードで:

val future = http(req)
var res: String = null
future onComplete {
    case Success(r) => res = r.getResponseBody
    case _ => println("KO")
}
while (!future.isCompleted) {
    Thread.sleep(1000)
}
println(res)

期待どおりの応答が得られます。

誰かがこれを理解していますか?Thread.sleep を呼び出すのは良いことではないように思えますが、この問題を正しく処理する方法についてヒントを教えてもらえますか?

編集: @Randal Schulz ご協力ありがとうございますが、コメントに投稿したように、回答を検証できません。

私の問題は、HTTP GET 要求に対して有効な応答が得られるまで待機する (そして他に何もしない) ことだったので、満足のいく方法は Await.result を使用することだと思います。コードから副作用を取り除きました。オプション メソッドを使用して Future の失敗に対処し (私は成功だけに関心があったため)、タイムアウト例外を従来の方法で処理しました。

ウィーティーズが言ったように、フューチャーにとどまってできると思いますが、もっと練習が必要です...

4

2 に答える 2

-1

私はついに先物を使って欲しいものを書くことができました:

def loop(): Future[String] = {
    val future = http(req).option
    future flatMap ((x: Option[Response]) => x match {
        case Some(rep) => rep.getResponseBody
        case None => loop()
    }
}

これで、応答が来るのを明示的に待たずに、この関数の結果を使用できます。

于 2014-01-31T12:44:44.923 に答える