顺序执行任意数量的Scala期货的列表

顺序执行任意数量的Scala期货的列表,scala,promise,future,Scala,Promise,Future,我读到了 我知道我可以使用回调、flatMap或combinator来理解连锁期货。当一个未来完成时,另一个未来开始,依此类推 是否有一种方法可以将存储在Scala集合(例如列表)中的任意数量的期货的执行链接起来? 我试图在这个未来列表中调用Future.sequence,但它们都是从一起开始的,并且它们是并发执行的(不是顺序执行的) 如果您可以接受提供一个返回未来的函数列表,那么这应该是您想要的。列表[Future[\u]]的问题是,它们已经启动,因此无法在执行方面进行链接。除非您提供一个单线

我读到了

我知道我可以使用回调、flatMap或combinator来理解连锁期货。当一个未来完成时,另一个未来开始,依此类推

是否有一种方法可以将存储在Scala集合(例如
列表
)中的任意数量的期货的执行链接起来? 我试图在这个未来列表中调用
Future.sequence
,但它们都是从一起开始的,并且它们是并发执行的(不是顺序执行的)

如果您可以接受提供一个返回未来的函数列表,那么这应该是您想要的。
列表[Future[\u]]
的问题是,它们已经启动,因此无法在执行方面进行链接。除非您提供一个单线程
ExecutionContext

如果失败,它将返回第一个失败并停止执行另一个失败

如果您可以接受提供一个返回未来的函数列表,那么这应该是您想要的。
列表[Future[\u]]
的问题是,它们已经启动,因此无法在执行方面进行链接。除非您提供一个单线程
ExecutionContext


如果失败,它将返回第一个失败并停止执行另一个期货。

我的答案是更关心如何处理任意数量的Scala期货函数的列表

  type FUTURE_FUNCTION = String => Future[String]

  def compose(fs: List[FUTURE_FUNCTION]): FUTURE_FUNCTION = fs match {
    case List(head) => head
    case head :: tail => head(_).flatMap { u => compose(tail)(u) }
  }
在上面的代码片段中,创建一个具有高阶未来函数参数的组合方法。该方法迭代所有高阶函数,构成一个全新的未来函数

示例用法:

  val f1: String => Future[String] =
    (s: String) => Future {
      s.toUpperCase
    }


  val f2: String => Future[String] =
    (s: String) => Future {
      s + " Hello World"
    }

  compose(List(f1, f2))("foo bar")
  > FOO BAR Hello World

我的答案是更关心如何处理任意数量的Scala Futures函数列表

  type FUTURE_FUNCTION = String => Future[String]

  def compose(fs: List[FUTURE_FUNCTION]): FUTURE_FUNCTION = fs match {
    case List(head) => head
    case head :: tail => head(_).flatMap { u => compose(tail)(u) }
  }
在上面的代码片段中,创建一个具有高阶未来函数参数的组合方法。该方法迭代所有高阶函数,构成一个全新的未来函数

示例用法:

  val f1: String => Future[String] =
    (s: String) => Future {
      s.toUpperCase
    }


  val f2: String => Future[String] =
    (s: String) => Future {
      s + " Hello World"
    }

  compose(List(f1, f2))("foo bar")
  > FOO BAR Hello World

您的解决方案可能的副本在这里:您需要提供可以将每个项和函数转换为future的项和函数列表,类似于future.traverse,但这将按顺序运行。如果你已经有了一个期货列表,那么你就有问题了,因为为时已晚,它们已经在运行了。我已经尝试了该链接中报告的解决方案,并且效果很好。我在写我的文章之前读过,但我不清楚。你在评论中的解释帮助我理解了它。感谢您的解决方案可能的副本在这里:您需要提供项目和函数的列表,这些项目和函数可以将它们转换为future,类似于future.traverse,但这将按顺序运行。如果你已经有了一个期货列表,那么你就有问题了,因为为时已晚,它们已经在运行了。我已经尝试了该链接中报告的解决方案,并且效果很好。我在写我的文章之前读过,但我不清楚。你在评论中的解释帮助我理解了它。谢天谢地,这根本不符合要求,当你通过一个期货清单时,它们都已经启动并并行运行。而且它不会累积结果。你称之为xs上的tail,而你可能指的是xs,它已经是列表的尾部。我发现至少有一个问题可以回答,这样可以解决你的问题。请参阅问题注释中的一个链接。这根本不符合要求,当你传递一个未来列表时,它们都已经启动并并行运行。而且它不会累积结果。你称之为xs上的tail,而你可能指的是xs,它已经是列表的尾部。我发现至少有一个问题可以回答,以便解决你的问题。请参阅您问题的评论中的链接,我已经尝试了解决方案,由@Łukasz在评论中建议。它可以工作,并且在概念上与您的解决方案类似。我不能预先创建一个期货列表,但我需要一个函数从一个“项目”中获取期货。ThanksI已经尝试了@Łukasz在评论中提出的解决方案。它可以工作,并且在概念上与您的解决方案类似。我不能预先创建一个期货列表,但我需要一个函数从一个“项目”中获取期货。谢谢