我正在使用 scala dispatch (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。我从我的代码中删除了副作用。我使用 option 方法来处理 Future 失败(因为我只对成功感兴趣),并且我以经典方式处理超时异常。
我想我可以像之前提到的那样做,留在未来,但我需要更多的练习......