加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

使用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和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])
  ))
)

并没有大惊小怪“没找到!”消息,但取决于你正在做什么可能不合适.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读