[英]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.