【问题标题】:Expecting a List[Future], what if there is a failed Future?期待一个 List[Future],如果有一个失败的 Future 怎么办?
【发布时间】:2017-10-08 05:43:19
【问题描述】:

我有这样的 IP 列表

val ips = List("ip1", "ip2", "ip3")

我使用该列表通过我的 wrapper get 方法执行 http get 请求,如果响应状态为 400,我的 wrapper get 方法将抛出 BadRequestException。我明白如果我取得了所有成功说200,因为myWrapper 返回Future[WSResponse],在好的情况下我的最终结果将是List[Future[WSResponse]]

示例 sn-p

def myresponses(ips:List[String]) = {
    ips.map(ip=>myWrapper(ip))
}

我的困惑和问题是,既然myWrapper 可以在状态为404 的情况下抛出异常,其他人还会执行吗?简而言之,在糟糕的情况下,说一个请求给404,其余的都给200,是否会是我将拥有List[WSResponse]的情况,对于其中一个元素,它会是一个例外吗?或者不是这样,如果一个 Future 失败了,其他的甚至可能不会执行?

【问题讨论】:

    标签: scala playframework


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-01-19
      • 2018-03-21
      • 1970-01-01
      • 2019-07-01
      • 2021-06-19
      • 2016-05-09
      • 2013-04-21
      • 2017-11-19
      相关资源
      最近更新 更多