2012-04-16 90 views
26

我剛開始學習Play 2.0框架。我無法理解的一件事是play tutorial中描述的Iteratee,Enumerator和Enumeratee模式。我在功能語言方面的經驗很少。不能理解遊戲中的迭代器,枚舉器,枚舉器2.0

這種模式完成了什麼?

它如何幫助我編寫非阻塞/反應式代碼?

一些簡單的例子會有所幫助。

+0

Play的創作者也有更新的演示。它會回答你的所有問題。 http://www.infoq.com/presentations/Play-I-ll-See-Your-Async-and-Raise-You-Reactive – biesior 2012-05-20 08:18:40

+0

這是[博客文章](http://apocalisp.wordpress.com/2010/10/17/scalaz-tutorial-enumeration-based-io-with-iteratees /)瞭解迭代。 Josh Suereth也有一篇關於他們的博客文章:http://jsuereth.com/scala/2012/02/29/iteratees.html – 2012-04-16 16:40:02

+0

和[瞭解普通人類的Play2迭代器](http:// mandubian。com/2012/08/27/understanding-play2-iteratees-for-normal-humans /) – 2014-07-12 14:35:44

回答

19

playframework 2.0下載附帶一些示例。其中兩個有Iteratee/Comet示例。舉例來說,彗星時鐘sample app顯示:

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

然後這樣使用:

Ok.stream(clock &> Comet(callback = "parent.clockChanged")) 

這將結果輸送給客戶端的塊。 Enumerator對象還有一個fromFile,fromStream(如java.io.InputStream)實用程序枚舉器函數。

我不知道在哪裏做了這個,但假設是這個分塊處理不是捆綁線程。看到一些基準測試會非常有趣,因爲迭代的執行會有一定的開銷,因爲要處理的數據以及計算包含在各種對象中。

從枚舉數中提供的數據被打包,以便它可以指示有更多數據要處理或數據已到達結尾(EOF)。迭代的處理結果也被打包,以便它可以指示某個輸入上是否計算了結果,或者需要更多輸入來計算結果。我推薦John De Goes'nescala presentation,它展示了從摺疊到迭代的演變。編輯:Brendan McAdams在異步和非阻塞方面擁有不錯的Scala Days 2012 presentation - 接近展示結束時(〜26分鐘),它涉及迭代以及它如何幫助處理異步樣式的數據庫光標樣式IO。

Iteratees一個被吹捧的好處是他們組成。以下是他們組成幾個方面:

  • 可以養活enumator andThen另一
  • 可以地圖(T) => U類型的超過T枚舉函數來獲取U
  • 枚舉你可以交錯兩個普查員
  • 迭代器可以留下一些輸入被其他迭代器使用
+0

該視頻演示文稿看起來是私密的。 – Traveler 2012-05-06 17:50:11

+0

@Traveler,的確,這曾經是公開的,這真是一種恥辱。我不知道這是故意還是臨時性的疏忽。 – huynhjl 2012-05-07 14:37:34

+0

@Traveler,我想他們修好了,我只是試了一下,現在視頻就可以使用了。 – huynhjl 2012-05-09 14:13:35