在Play 2.0中无法理解Iteratee,Enumerator,Enumeratee

rah*_*hul 26 scala playframework iterate playframework-2.0

我刚刚开始学习Play 2.0 Framework.我无法理解的一件事是游戏教程中描述的Iteratee,Enumerator和Enumeratee模式.我对函数式语言的经验很少.

这种模式有什么作用?

它如何帮助我编写非阻塞/反应代码?

一些简单的例子会有帮助.

huy*_*hjl 19

playframework 2.0下载附带一些示例.其中两个有Iteratee/Comet示例.例如,彗星时钟示例应用程序显示:

lazy val clock = Enumerator.fromCallback { () =>
  Promise.timeout(Some(dateFormat.format(new Date)), 100 milliseconds)
}
Run Code Online (Sandbox Code Playgroud)

然后就像这样使用:

Ok.stream(clock &> Comet(callback = "parent.clockChanged"))
Run Code Online (Sandbox Code Playgroud)

这将以块的形式将结果提供给客户端.该Enumerator对象还具有fromFile,fromStream(如在java.io.InputStream)实用程序枚举函数.

我不确定这是做什么的,但假设这个分块处理不会占用线程.看到一些基准测试会非常有趣,因为迭代项的实现肯定会产生开销,因为要处理的数据以及计算都包含在各种对象中.

从枚举器馈送的数据被包装,以便它可以指示有更多数据要处理或数据已到达终点(EOF).迭代的处理结果也被包装,以便它可以指示是否已经在某个输入上计算了结果,或者需要更多输入来计算结果.我推荐John De Goes的nescala演示文稿,展示从折叠到Iteratees的演变.编辑:Brendan McAdams 在Async和非阻塞方面有一个很好的Scala Days 2012 演示文稿 - 在演示结束时(~26分钟)它触及迭代,以及它如何帮助处理异步风格的数据库光标样式IO.

一个被吹捧的好处Iteratees是它们构成.以下是他们撰写的几种方式:

  • 你可以喂一个enumator 然后另一个
  • 你可以在枚举器上映射一个类型的函数来得到一个枚举器(T) => UTU
  • 你可以交错两个枚举器
  • 迭代器可以留下一些输入以供另一个迭代器使用