2013-01-03 15 views
5

W moim programie w Play 2.0.4 miałem ten kawałek kodu:PlayFramework 2.0.x -> 2,1-RC migracja

val channel = Enumerator.imperative[JsValue](onStart = self ! NotifyJoin(username)) 

a teraz mówi, że imperative jest przestarzała, a API mówi, że zamiast tego należy użyć unicast lub broadcast. Używam unicast, ponieważ w moim kodzie channel był unicast. Więc zrobię jak

val channel = Concurrent.unicast[JsValue](onStart = self ! NotifyJoin(username)) 

Ale to nie działa .. wygląda, że ​​unicast chce czegoś innego. Nie mogę tego rozgryźć - nie ma więcej informacji w API ... Czy ktoś wie co tu robić?

UPDATE:

rozpoczął dyskusję w grupie użytkowników play ramowej. Okazuje się być dość powszechnym problemem wśród programistów, którzy znają ten paradygmat. Mam nadzieję, że dokumentacja ulegnie poprawie.

+0

Myślę, że gra w ramy 2. *. * Nie jest dobra w dokumentacji, gdy porównamy ją z wersjami 1.x.x. –

Odpowiedz

3

API dla Concurrent.unicast jest:

unicast[E](onStart: (Channel[E]) ⇒ Unit, onComplete: ⇒ Unit, onError: (String, Input[E]) ⇒ Unit): Enumerator[E] 

API dla Concurrent.broadcast jest:

broadcast[E]: (Enumerator[E], Channel[E]) 

Można dostać się na API w swojej aplikacji pod adresem:

http://localhost:9000/@documentation/api/scala/index.html#play.api.libs.iteratee.Concurrent$ 
+2

Tak, widziałem to na stronie internetowej. Szkoda, nie mówi nic o tym, skąd otrzymuję "Channel [E]" lub "Enumerator [E]" i tak naprawdę nie wyjaśnia, jak to działa. Właściwie w momencie, gdy byłem na stronie API, były tylko te dwa podpisy. Ale to nie jest dużo więcej pomocy niż Eclipse zapewnia domyślnie w podpowiedziach autouzupełniania. Próbuję tylko pokazać, że warto wytłumaczyć pewne wyjaśnienia. – noncom

+0

'broadcast' zwraca krotkę z' Enumerator [E] 'i' Channel [E] '. Czy to nie jest to, czego potrzebujesz? –

+1

Haha, zadzwoń do mnie, co chcesz, ale jestem zupełnie nowy w tego rodzaju API, więc chcę tylko dobrego wyjaśnienia tekstowego, a nie podpisów. W każdym razie istnieje już wątek w grupie użytkowników Play o tym ... okazuje się, że wiele osób w tej dziedzinie jest nowością. – noncom

0

przykładzie przy użyciu Unicast:

// here is an enumerator that returns a chunk to the channel 
val outEnumerator = Concurrent.unicast[JsValue] { channel => 
    val data = Json.obj("data" -> 12345) 
    channel.push(data) 
} 

Alternatywą przy użyciu starego Enumerator.imperative jest użycie generateM:

val out = Enumerator.generateM[JsValue] { 
    Promise.timeout({ 
     Some(Json.obj("data" -> 12345)) 
    }, 100, TimeUnit.MILLISECONDS) 
} 

Tutaj generować wartość powtarzający używając timeout. Ten moduł wyliczający powtarza się na zawsze, chociaż generateM pozwala na zwrócenie None, aby wskazać, kiedy to zrobione.