我有这样的IP列表
val ips = List("ip1", "ip2", "ip3")
我使用该列表通过我的包装器get方法执行http get请求,如果响应状态为BadRequestException
,我的包装器get方法将抛出400
。我理解,如果我取得所有成功,请说200
,因为myWrapper返回Future[WSResponse]
,在最好的情况下,我的最终结果将是List[Future[WSResponse]]
示例摘录
def myresponses(ips:List[String]) = {
ips.map(ip=>myWrapper(ip))
}
我的困惑和疑问是,由于myWrapper
可以在状态404
的情况下抛出异常,其他人还会执行吗?简而言之,如果一个请求提供404
并说剩下的所有请求200
,那么我是否会List[WSResponse]
并且其中一个元素是会有例外吗?或者情况并非如此,如果一个Future失败了,其他的甚至可能都没有执行?
答案 0 :(得分:0)
他们都会执行。如果存在异常,那么该元素将是一个失败的未来。它仍将具有类型 Future[Response]
,但如果您尝试Await.result
,则会抛出异常。如果您尝试进一步转换(map
,flatMap
等)失败的Future
,则不会发生任何事情(转换将永远不会执行)。
您可以使用.recover
或.recoverWith
处理这些例外(它们类似于.map
和flatMap
,但只会在未来失败时调用转换)或报告/清除使用.onFailure
(还有.onSuccess
和.onComplete
来处理这两种情况)。
这里有一个处理scala期货的好教程: https://docs.scala-lang.org/overviews/core/futures.html