scala - ディスパッチの例が動作しない

ディスパッチドキュメントの最初の例に従っています。

    val svc = url("http://api.hostip.info/country.php")
    val country = Http(svc OK as.String)
    for (c <- country)
      println(c)

私はどんな出力も印刷されません。ブロッキングコールをするために私はそれを以下に変更すると出力が得られます。

val res = country()
println(res)

これで助けが必要です。

フルプログラム -

import dispatch._
object DispatchTest {

  def main(args: Array[String]) {
    val svc = url("http://api.hostip.info/country.php")
    val country = Http(svc OK as.String)
    for (c <- country)
      println(c)
  }
}
3
それは完璧に動作します。 for の内容は println コマンドを Promise オブジェクトにラップするので、 c の値が利用可能な場合にのみ実行されます
追加された 著者 pagoda_5b,
どのバージョンのディスパッチを使用していますか? build.sbtなどを表示できますか?
追加された 著者 pagoda_5b,
追加された 著者 pagoda_5b,
私はブロックされているとは思わない。resはまだ未来? try println(res.get)
追加された 著者 twillouer,
上記の私のbuild.sbtを貼り付ける。
追加された 著者 Shwetanka,

2 答え

うーん、ここでは分かりませんが、多分問題は、メインスレッドが非常に高速に処理され、そのバックグラウンドスレッド(Dispatchが非同期に動作する)にアクションをとる時間がないということですか?

これをチェックするには、遅延を挿入することがあります:

for (c <- country)//Here we spawn a background thread!
  println(c)

Thread.sleep(500)//So let's wait half a second for it to work

もちろん、実際のプログラムではこれを行う必要はありません。

遅延の別のオプションは、メインの最後の readLine()です。

6
追加された
接続が非常に遅い場合に遅延を増やす必要があるかもしれません。
追加された 著者 AnonGeek,
コードが動作するかどうか、sbt-consoleに貼り付けるときにチェックすることもできます
追加された 著者 pagoda_5b,
はい、そうです。遅延を追加すると出力が得られます。ありがとう!
追加された 著者 Shwetanka,

それはここで動作します:

scala> import dispatch._
import dispatch._

scala> val svc = url("http://api.hostip.info/country.php")
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
svc: com.ning.http.client.RequestBuilder = [email protected]

scala> val country = Http(svc OK as.String)
country: dispatch.Promise[String] = Promise(-incomplete-)

scala> for (c <- country)
     |   println(c)

scala> BR

プロンプトの後に表示される BR に注意してください。

その国はどこかには印刷されていませんが、他の出力と混ざり合っているので気づかなかったでしょうか?

0
追加された
私はそれを主な機能として実行しています。私は私の質問を更新しました。
追加された 著者 Shwetanka,