【发布时间】:2013-05-27 07:06:32
【问题描述】:
我目前正试图围绕Enumerators 和Iteratees 的想法。我决定从查看 Play 2.0 的 iteratee 库开始,该库已添加到我的测试项目中,并在我的 build.sbt 文件中添加了以下行。 (我使用的是 Scala 2.10)(docs here)
resolvers += "Typesafe repository" at
"http://repo.typesafe.com/typesafe/releases/"
libraryDependencies += "play" %% "play-iteratees" % "2.1.1"
我的目标是在文件的字节上创建一个枚举器,并最终为其附加一些解析逻辑,但是当我尝试看似简单的事情时,我得到了一个异常。 我的代码如下所示:
val instr = getClass.getResourceAsStream(...)
val streamBytes = for {
chunk <- Enumerator fromStream instr
byte <- Enumerator enumerate chunk
} yield byte
val printer = Iteratee.foreach[Byte](println)
streamBytes.apply(printer)
发生的情况是(我假设是)文件中的所有字节都被打印出来,然后我收到一个 IllegalStateException 说“承诺已经完成”。
java.lang.IllegalStateException: Promise already completed.
at scala.concurrent.Promise$class.complete(Promise.scala:55)
at scala.concurrent.impl.Promise$DefaultPromise.complete(Promise.scala:58)
at scala.concurrent.Promise$class.failure(Promise.scala:107)
at scala.concurrent.impl.Promise$DefaultPromise.failure(Promise.scala:58)
at scala.concurrent.Future$$anonfun$flatMap$1.liftedTree3$1(Future.scala:283)
at scala.concurrent.Future$$anonfun$flatMap$1.apply(Future.scala:277)
at scala.concurrent.Future$$anonfun$flatMap$1.apply(Future.scala:274)
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:29)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
由于堆栈跟踪没有指向我的代码中的任何地方,而且这是一个不熟悉的领域,我不知道出了什么问题。谁能提供一些见解或解决此问题的方法?
【问题讨论】:
标签: scala playframework-2.0 iterate