将Seq [Future [X]]转换为枚举器[X]

Hen*_*ory 11 scala playframework-2.0

有没有办法将Seq [Future [X]]变成枚举器[X]?用例是我想通过抓取网络来获取资源.这将返回一个期货序列,我想返回一个枚举器,它将按照它们首次完成的顺序推送到Iteratee.

看起来Victor Klang的Future select gist可以用来做到这一点 - 尽管看起来效率很低.

注意:有问题的Iteratees和Enumerator是play框架版本2.x给出的,即具有以下导入: import play.api.libs.iteratee._

Hen*_*ory 2

一个更好、更短、我认为更有效的答案是:

   def toEnumerator(seqFutureX: Seq[Future[X]]) = new Enumerator[X] { 
      def apply[A](i: Iteratee[X, A]): Future[Iteratee[X, A]] = {
        Future.sequence(seqFutureX).flatMap { seqX: Seq[X] => 
            seqX.foldLeft(Future.successful(i)) {
              case (i, x) => i.flatMap(_.feed(Input.El(x)))
            }
        }
      }
    }
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果任何“seqFutureX” future 失败,“Future.sequence” 将返回失败的 Future。 (2认同)