期待列表[未来],如果未来失败怎么办?

时间:2017-10-07 21:23:00

标签: scala playframework

我有这样的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失败了,其他的甚至可能都没有执行?

1 个答案:

答案 0 :(得分:0)

他们都会执行。如果存在异常,那么该元素将是一个失败的未来。它仍将具有类型 Future[Response],但如果您尝试Await.result,则会抛出异常。如果您尝试进一步转换(mapflatMap等)失败的Future,则不会发生任何事情(转换将永远不会执行)。 您可以使用.recover.recoverWith处理这些例外(它们类似于.mapflatMap,但只会在未来失败时调用转换)或报告/清除使用.onFailure(还有.onSuccess.onComplete来处理这两种情况)。

这里有一个处理scala期货的好教程: https://docs.scala-lang.org/overviews/core/futures.html