Scala ожидает завершения асинхронного вызова - PullRequest
2 голосов
/ 29 марта 2019

Я новичок в scala, и мне нужно сделать асинхронный вызов (индексирование эластичности с использованиемastic4s) при выполнении итерации для каждого цикла.Каков наилучший способ сделать это в Scala.

val data = List("1","2","3","4")

data.foreach(element=>{
          asyncCall(element)
        })

Как выполнить какое-либо действие после завершения всего asyncCall.Я не хочу ничего делать с ответом.Просто напечатайте успех, если все успешно, и напечатайте сбой, если какой-либо вызов не удался.asyncCall возвращает Future [T].

1 Ответ

1 голос
/ 29 марта 2019

Вы должны использовать Future.sequence.Он изменяется List[Future[T]] на Future[List[T]].

Так в вашем примере:

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.{Failure, Success}

val f = Future.sequence(data.map(asyncCall)) // Future[List[String]] 

//you can now do something when future finishes:
f.onComplete{
  case Success(s) => println(s"Evethings fine: $s")
  case Failure(e) => println(s"Something went wrong: $e")
}
...