2013-01-03 6 views
5

Nel mio programma su Play 2.0.4 ho avuto questo pezzo di codice:play framework 2.0.x -> 2.1-RC migrazione

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

e ora si dice che imperative è obsoleto e l'API dice che io utilizzare invece unicast o broadcast. Tendo ad usare unicast poiché nel mio codice lo channel era unicast. Così faccio come

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

Ma non funziona .. sembra che unicast vuole qualcos'altro. Non riesco a capirlo - non ci sono più informazioni nell'API ... qualcuno sa cosa fare qui?

UPDATE:

iniziare una discussione nel gruppo di utenti gioco Framework. Risulta essere un problema piuttosto comune tra gli sviluppatori, che conoscono il paradigma. Speriamo che la documentazione sarà migliorata.

+0

Penso che il framework di gioco 2. *. * Non sia valido nella documentazione quando lo confrontiamo con le versioni 1.x.x. –

risposta

3

L'API per Concurrent.unicast è:

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

L'API per Concurrent.broadcast è:

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

si può arrivare alle API nella vostra applicazione in:

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

Sì, l'ho visto sul sito web. Peccato, non dice nulla su dove ottengo il 'Channel [E]', o 'Enumerator [E]' e non spiega realmente come funzioni la cosa. In realtà, quando ero sulla pagina API, c'erano solo queste due firme. Ma questo non è molto più utile di Eclipse fornisce, di default, nei suoi suggerimenti di autocompletamento. Sto solo cercando di sottolineare che vale una spiegazione. – noncom

+0

'broadcast' restituisce una tupla con un' Enumeratore [E] 'e un' Canale [E] '. Non è quello che ti serve? –

+1

Haha, chiamami cosa vuoi, ma sono totalmente nuovo a questo tipo di API, quindi voglio solo una buona spiegazione testuale, non le firme. Ad ogni modo, c'è già un thread nel gruppo di gioco di Play Framework su questo ... si scopre che molti ppl sono nuovi in ​​quest'area. – noncom

0

Esempio di utilizzando 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) 
} 

Un'alternativa a utilizzare il vecchio Enumerator.imperative è quello di utilizzare il generateM:

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

Qui, si genera un valore di ripetizione con un timeout. Questo enumeratore si ripete per sempre, anche se generateM consente di restituire None per indicare quando è terminato.