繁体   English   中英

使用Play2 / Scala进行定期WS调用以提供Enumerator的最佳方法?

[英]Best way to make a periodic WS call to feed an Enumerator with Play2/Scala?

我使用Enumerator模式每秒使用WS.url检索一些推文

Enumerator.fromCallback[String](() => 
        Promise.timeout(WS.url("http://search.twitter.com/search.json?q="+query+"&rpp=1").get().map { response =>
            val tweets = response.json \\ "text"
            tweets match {
                case Nil => "Nothing found!"
                case head :: tail => query + " : " + head.as[String]
            }
        }.map(Some.apply).value.get, 1000 milliseconds)
  )

我的问题是

Enumerator.fromCallback[String]() 

正在等待

Promise[Option[String]]

由于WS.url(...)。get返回一个Promise,因为我使用Promise.timeout每秒重新​​启动一次调用,

我有一个

Promise[Promise[Option[String]]] 

所以我必须使用value.get来获得良好的类型,因此对于异步方面来说它似乎不是很干净。

这段代码有效但我的问题是:有没有更好的方法,更优雅,实现这一目标? 我可以从另一个Promise和Promise.timeout轻松获得承诺吗?

谢谢 :)

Promise是一个monad,一般来说当你发现自己有一个嵌套的monad时,你想在某个地方贴一个flatMap 在你的情况下,这样的东西应该工作:

import akka.util.duration._
import play.api.libs.concurrent._
import play.api.libs.iteratee._
import play.api.libs.ws._

val query = "test"
val url = WS.url("http://search.twitter.com/search.json?q=" + query + "&rpp=1")

val tweets = Enumerator.fromCallback[String](() => 
  Promise.timeout(url.get, 1000 milliseconds).flatMap(_.map { response =>
    (response.json \\ "text") match {
      case Nil => "Nothing found!"
      case head :: _ => query + " : " + head.as[String]
    }
  }.map(Some.apply))
)

我个人写的更像这样:

val tweets = Enumerator.fromCallback[String](() => 
  Promise.timeout(url.get, 1000 milliseconds).flatMap(_.map(
    _.json.\\("text").headOption.map(query + " " + _.as[String])
  ))
)

并没有大惊小怪"Nothing found!" 消息,但取决于你正在做什么可能不合适。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM