使用Play2 / Scala进行定期WS调用以提供Enumerator的最佳方法?
发布时间:2020-12-16 10:02:27 所属栏目:安全 来源:网络整理
导读:我使用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 {
我使用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是一个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]) )) ) 并没有大惊小怪“没找到!”消息,但取决于你正在做什么可能不合适. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |