scala: Asyn c обработка с использованием Future.sequence - PullRequest
0 голосов
/ 03 марта 2020

У меня есть такой метод:

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

У меня есть список запросов, я хочу вызвать метод выборки asyn c, и если одна загрузка не удалась, то весь метод завершится ошибкой / сгенерирует , Если все выборки выполнены успешно, извлеките поле из тела ответа и верните список.

Что-то вроде:

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

Как кодировать остальные, чтобы правильно обработать попытку? Если нет Try, я думаю, я могу просто использовать Future.sequence(), который преобразует список Futures в Future of list.

1 Ответ

0 голосов
/ 03 марта 2020

вы можете использовать последовательность для объединения 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)
  })
}
...