向服务器重复异步请求
问题描述:
我想要做的是一次又一次地重复GET请求到服务器,以便我可以同步本地数据与远程服务器。我想通过使用Future
s 而不涉及akka这样做,因为我只想了解如何在较低级别执行此操作的基本思路。没有async
和await
最好或者是因为它们是Futures
和Promises
的高级功能,因此我想自己使用Futures
和Promises
。向服务器重复异步请求
所以这是我的功能:
def sendHttpRequestToServer(): String = { ... }
def send: Unit = {
val f = future { sendHttpRequestToServer() }
f onComplete {
case Success(x) =>
processResult(x) // do something with result "x"
send // delay if needed and send the request again
case onFailure(e) =>
logException(e)
send // send the request again
}
}
这就是我想可能是。我怎么能改变它,算法中有没有错误?你的想法。
UPDATE:
正如我已经知道了,期货不是专为经常性的任务,只有一次性的。因此,他们不能在这里使用。那我该用什么?
答
您的代码在异常处理方面存在一些问题。如果在processResult
或logException
中出现异常,send
将不再发生,从而打断您的循环。这个异常也不会被记录。更好的方法是:
f.map(processResult).onFailure(logException)
f.onComplete(x => send())
这样的send
仍然发生,尽管在processResult
或logException
例外,从processResult
异常会被记录,而结果仍在处理下一发送可以开始中间。如果你想等到处理完成,你可以这样做:
val f2 = f.map(processResult).recover { case e => logException(e) }
f2.onComplete(x => send())
但是你怎么知道processResult和logException是否有try ... catch块? –
我不知道。这种方式我不必知道,processResult不需要自己单独的try/catch /调用'logException',所以代码是DRYer。 – wingedsubmariner
我不认为如果processResult和logException没有try ... catch然后代码DRYer。你为什么这么认为? –