Play Iteratees: ошибка для простой итерации файла

В настоящее время я пытаюсь обернуть голову вокруг идеи Enumerators а также Iteratees, Я решил начать с просмотра библиотеки iteratee в Play 2.0, которую я добавил в свой тестовый проект со следующими строками в файле build.sbt. (Я использую Scala 2.10) ( документы здесь)

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 говорят, что "Обещание уже выполнено".

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)

Поскольку трассировка стека нигде не указана в моем коде, а это незнакомая территория, я понятия не имею, что происходит не так. Кто-нибудь может предложить какое-то понимание или решение этой проблемы?

1 ответ

Решение

Посмотрите, работает ли это для вас. Я тоже получал исключения с вашим кодом, но когда я размотал ваш for-comp, все заработало. Я не уверен на 100%, почему, потому что я думал, что for-comp все равно не подходит для этого кода, но я должен что-то упустить:

val bytes = Enumerator fromStream instr flatMap (Enumerator enumerate _)    
val printer = Iteratee.foreach[Byte](b => println(b))    
bytes |>> printer 
Другие вопросы по тегам