我真的觉得我做了一些设计无法做到的事情,但我真的想完全理解Play Iteratees是如何工作的......
我目前正在撰写一个功能,通过Enumerator
对Enumeratee
进行一些转换。截至目前,我在进行这一特定转型方面没有任何问题。但是我想在Enumerator
之前添加一些元素。我想过使用mapInput
或mapInputFlatten
,因为我可以看到当时正在处理哪个Input
。我目前解决这个问题的方法如下:
import play.api.libs.iteratee.{Enumerator, Enumeratee, Input, Iteratee}
import scala.concurrent.Await
import scala.concurrent.duration.DurationInt
def appendingEnumeratee: Enumeratee[Int, Int] = Enumeratee.mapInputFlatten {
case Input.El(i) => Enumerator(i)
case Input.Empty => Enumerator.enumInput(Input.Empty)
case Input.EOF => Enumerator(42)
}
Await.result(Enumerator(1 to 41: _*).through(appendingEnumeratee).apply(Iteratee.getChunks), 5.seconds)
但是,我最终得到java.lang.RuntimeException: diverging iteratee after Input.EOF
。这是在Scala 2.10.2上的play-iteratees 2.1.5
答案 0 :(得分:2)
我认为代码的问题是缺少EOF。因此将其修改为以下内容将起作用:
def appendingEnumeratee: Enumeratee[Int, Int] = Enumeratee.mapInputFlatten {
case Input.El(i) => Enumerator(i)
case Input.Empty => Enumerator.enumInput(Input.Empty)
case Input.EOF => Enumerator(42) andThen Enumerator.enumInput(Input.EOF)
}
或者更短一些:
def appendingEnumeratee: Enumeratee[Int, Int] = Enumeratee.mapInputFlatten {
case Input.EOF => Enumerator(42) >>> Enumerator.enumInput(Input.EOF)
case _else => Enumerator.enumInput(_else)
}