我正在使用scala dispatch(0.11.0)庫向遠程服務器發送HTTP GET請求。我想在執行請求之後的代碼之前等待響應。我該如何等待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。我從我的代碼中刪除了副作用。我用選項方法來處理未來的失敗(因爲我只對成功感興趣),並且我用經典的方式處理超時異常。
我想我能做到這一點的麥片mentionned,留在未來,但我需要更多的練習......
使用'Await.ready'(返回'Future'本身)或'Await.result'(返回由'Future'計算出的值),併爲可能的異常做準備,因爲「Future」超時或失敗'本身。 –
好的,謝謝你指出這些,因爲我沒有意識到Future不是一個派遣概念。儘管如此,使用Await.result,我得到的結果與以前相同:/ – ygu
您顯示了三次嘗試(其中只有一次嘗試產生了「預期響應」)。當你說你得到「和以前一樣的結果」時,你指的是哪一個?「 –