Scala等待异步调用完成循环

时间:2019-03-29 17:20:46

标签: scala asynchronous foreach future

我是scala的新手,我必须在每个循环进行迭代时进行异步调用(使用elastic4s进行弹性索引编制)。在scala中执行此操作的最佳方法是什么。

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

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

所有asyncCall完成后,如何执行某些操作。我不想对响应做任何事情。如果一切成功,则仅打印成功;如果任何呼叫失败,则打印失败。 asyncCall返回Future [T]。

1 个答案:

答案 0 :(得分:1)

您应该使用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")
}