scala - Play 迭代器 : error for simple file iteration

标签 scala playframework-2.0 iterate

我目前正试图围绕 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"

我的目标是在文件的字节上创建一个 Enumerator,并最终将一些解析逻辑附加到它,但是当我尝试看起来很简单的事情时,我得到了一个异常。
我的代码如下所示:
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说“ promise 已经完成”。
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)

由于堆栈跟踪没有指向我代码中的任何地方,而且这是一个陌生的领域,我不知道出了什么问题。任何人都可以为这个问题提供一些见解或解决方案吗?

最佳答案

看看这是否适合你。我也遇到了您的代码异常,但是当我解开您的 for-comp 时,一切正常。我不是 100% 确定为什么,因为我认为 for-comp 无论如何都对这段代码进行了脱糖,但我一定遗漏了一些东西:

val bytes = Enumerator fromStream instr flatMap (Enumerator enumerate _)    
val printer = Iteratee.foreach[Byte](b => println(b))    
bytes |>> printer 

关于scala - Play 迭代器 : error for simple file iteration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16857644/

相关文章:

scala - 使用 Play2/Scala 进行定期 WS 调用以提供 Enumerator 的最佳方法?

haskell - iteratee的介绍或简单示例?

java - 如何通过解析 xml 创建一个集合,其中每个 child 都有他的 parent

java - Ebean finder 列表大小条件

postgresql - 在 Heroku 上部署 Play Framework 2.1.1

validation - 如何仅在创建对象时应用 Play 2 唯一性验证?

scala - ReactiveMongo 是如何实现的,因此它被认为是非阻塞的?

scala - 了解 scala 集合执行

scala - java.lang.VerifyError : Bad type on operand stack using Scala Pickle

scala - 使用命令行参数运行 SBT 任务