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