scala - 依次执行 Scala Futures

标签 scala future

给定一个返回 Future 的方法像这样...

def myMethod(name: String, count: Int, default: Boolean): Future[Unit] = {
  ...
}

...我需要调用它 N 次,所以我定义了一个包含要传递的参数的元组列表:
val paramList = List(
  ("text1", 22, true),
  ("text2", 55, true),
  ("text3", 77, false)
)

我如何调用 myMethodFuture.traverse ?
Future.traverse(paramList)(myMethod _).tupled(/* how do I pass the current tuple here? */)

最佳答案

两种可能的方法:

val futuresFromSequence: Future[List[Unit]] = Future.sequence(paramList.map { 
  case (a,b,c) => myMethod(a,b,c) 
})

val futuresFromTraverse: Future[List[Unit]] = Future.traverse(paramList)(x => x match {
  case(a,b,c) => myMethod(a,b,c)
})

请注意 traverse将一些集合和一个函数从该集合的一个项目带到 future ,sequence取而代之的是获取一个 future 列表并将其折叠为列表的 future 。

如果您想坚持使用 tupled语法(我个人不喜欢):
Future.traverse(paramList)(x => (myMethod _).tupled(x))

如评论中所述,您可能希望串行运行它们(尽管问题并非 100% 明确),在这种情况下,您可以使用 foldLeftflatMap链接 future 的执行:
myList.foldLeft(Future(List.empty[Unit]))((prevFuture, currentTuple) => {
  for {
    prev <- prevFuture
    curr <- (myMethod _).tupled(currentTuple)
  } yield prev :+ curr
})

基本上第一个生成器在启动新生成器之前等待累加器中的 future 完成,这也会返回 Future[List[Unit]] .

关于scala - 依次执行 Scala Futures,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25878981/

相关文章:

scala - 在 Scala 中执行元组之外的函数

Scala Future.find

java - Future 任务什么时候完成

scala - 为成功和失败绘制 future 图

javascript - 使用 future 的javascript dom

scala - 如何制作 ArrayBuffer 的 ArrayBuffer

Scala:Spark SQL to_date(unix_timestamp) 返回 NULL

postgresql - Slick 2 发电机 : tables with same names on different schemas

java - 如何询问 CompletableFuture 使用非守护线程?

eclipse - ScalaIDE : how do I get tooltips as in Java when hovering over an error?