2

我真的觉得我在做一些设计上不可能的事情,但我真的很想完全了解 Play Iteratees 是如何工作的......

我目前正在编写一个函数,该函数Enumerator通过Enumeratee. 到目前为止,我进行这种特定的转换没有问题。但我想在Enumerator. 我想到了使用mapInputor 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

4

1 回答 1

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)
}
于 2014-02-05T07:45:29.460 回答