2016-01-09 2 views
0

Вот пример из Реактивные веб-приложения в Play книге:Понимание Iteratee в рамках игры

package controllers 

import play.api._ 
import play.api.libs.iteratee.Iteratee 
import play.api.libs.oauth.{OAuthCalculator, RequestToken, ConsumerKey} 
import play.api.Play.current 
import play.api.libs.ws.WS 
import play.api.mvc._ 


import scala.concurrent.ExecutionContext.Implicits.global 
import scala.concurrent.Future 

class Application extends Controller { 

    val loggingIteratee = Iteratee.foreach[Array[Byte]] { 
    array => Logger.info(array.map(_.toChar).mkString) 
    } 

    def tweets = Action.async { 
    val credentials: Option[(ConsumerKey, RequestToken)] = for { 
     apiKey <- Play.configuration.getString("twitter.apiKey") 
     apiSecret <- Play.configuration.getString("twitter.apiSecret") 
     token <- Play.configuration.getString("twitter.token") 
     tokenSecret <- Play.configuration.getString("twitter.tokenSecret") 
    } yield (
     ConsumerKey(apiKey, apiSecret), 
     RequestToken(token, tokenSecret) 
    ) 
    credentials.map { 
     case (consumerKey, requestToken) => WS.url("https://stream.twitter.com/1.1/statuses/filter.json") 
      .sign(OAuthCalculator(consumerKey, requestToken)) 
      .withQueryString("track" -> "cat") 
      .get { 
      response => 
       Logger.info("Status: " + response.status) 
       loggingIteratee 
      } 
      .map(response => Ok("Stream closed")) 
    } getOrElse { 
     Future { 
     InternalServerError("Twitter credentials missing") 
     } 
    } 
    } 

    def index = Action { 
    Ok(views.html.index("Your new application is ready.")) 
    } 

} 

Я с трудом понимая оборванных линии:

loggingIteratee 

В этом случае похоже, записывает сообщения о коте из твиттера. Но как это достигается? Мы ничего не передавали.

+1

кажется как 'get' метод нуждается в функции от ответ на «Iteratee», а затем он использует его внутренне. См. Docs: https://www.playframework.com/documentation/2.3.x/api/scala/index.html#play.api.libs.ws.WSRequestHolder 'get [A] (потребитель: (WSResponseHeaders) ⇒ Iteratee [ Array [Byte], A]) ' –

+0

Да, я только что понял, что минуту назад. Благодаря! Не могли бы вы написать ответ? Я буду рад принять! :) – qed

ответ

1

get метод нуждается в функции от ответа до Iteratee, а затем он использует его внутри. См документы:

https://www.playframework.com/documentation/2.3.x/api/scala/index.html#play.api.libs.ws.WSRequestHolder

и исходный код (здесь: https://github.com/playframework/playframework/blob/2.3.x/framework/src/play-ws/src/main/scala/play/api/libs/ws/WS.scala)

/** 
* performs a get 
* @param consumer that's handling the response 
*/ 
def get[A](consumer: WSResponseHeaders => Iteratee[Array[Byte], A])(implicit ec: ExecutionContext): Future[Iteratee[Array[Byte], A]] = { 
    getStream().flatMap { 
    case (response, enumerator) => 
     enumerator(consumer(response)) 
    } 
} 

так что в основном ставит каждый ответ через этот Iteratee

Смежные вопросы