【问题标题】:scala: Async processing using Future.sequencescala:使用 Future.sequence 进行异步处理
【发布时间】:2020-06-15 08:30:48
【问题描述】:

我有这样的方法:

fetch(request: Request) which returns a Future<Try<Response>> 

我有一个请求列表,想要异步调用 fetch 方法,如果一个 fetch 失败,那么整个方法将失败/抛出。如果所有获取都成功,则从响应正文中提取一个字段并返回一个列表。

类似:

fetchAll(requests: List<Request>) {
   List<Future<Try<Response>>> futureResponses;
   requests.stream().map(request -> {
      Future<Try<Response>> futureResp = fetch(request);
      futureResponses.add(futureResp);
   })
}

如何编写其余代码以正确处理 Try?如果没有 Try,我想我可以使用 Future.sequence() 将 Futures 列表转换为 Future 列表。

【问题讨论】:

  • 您的问题被标记为scala,但代码是Java。请澄清。
  • 获取API是scala,但是需要用Java调用API。所以它有点混合了 Scala 和 Java。
  • 您可以查看Future.reduceLeft

标签: scala future


【解决方案1】:

你可以使用序列来联合Seq[Future[T]]Future[Seq[T]],你可以使用flatMap来中断序列尝试:

def fetchAll(requests: List[Request])(implicit executionContext: ExecutionContext): Future[List[Response]] = {
  Future.sequence(requests.map(fetch)).map(listTry => listTry.flatMap {
    case Failure(exception) => throw exception
    case Success(value) => Seq(value)
  })
}

【讨论】:

    猜你喜欢
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    相关资源
    最近更新 更多