【问题标题】:Scala wait for async call to complete in loopScala等待异步调用在循环中完成
【发布时间】:2019-08-20 16:46:01
【问题描述】:

我是 scala 的新手,我必须在遍历 for 每个循环时进行异步调用(使用 elastic4s 进行弹性索引)。在 scala 中最好的方法是什么。

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

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

在所有 asyncCall 完成后如何做一些动作。我不想对响应做任何事情。如果一切成功,则打印成功,如果任何调用失败,则打印失败。 asyncCall 返回 Future[T]。

【问题讨论】:

  • 您是打算并行处理所有 asyncCalls 还是一个接一个地处理?

标签: scala asynchronous foreach future


【解决方案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")
}

【讨论】:

    猜你喜欢
    • 2020-08-02
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    相关资源
    最近更新 更多