gpt4 book ai didi

scala - 依次执行 Scala Futures

转载 作者:行者123 更新时间:2023-12-04 17:18:57 25 4
gpt4 key购买 nike

给定一个返回 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com