我在我的控制器中使用Finagle客户端的方法(FinagleClient.longRunningComputation)
def alfa = Action.async(parse.json) { request =>
val response = FinagleClient.longRunningComputation(request.body )
response.map( rest => Ok("Got result: " + rest ))
}
我需要在播放控制器中获取com.twitter.util.Future的结果
我尝试使用Returning futures,但编译器返回以下错误:
found : com.twitter.util.Future[play.api.mvc.Result]
required: scala.concurrent.Future[play.api.mvc.Result]
response.map(rest => Ok("Got result: " + rest))
我需要在我的播放控制器中使用com.twitter.util.Future
我该怎么做?
答案 0 :(得分:2)
您必须转换为scala.concurrent.Future
,您可以使用Promise
进行转换。
这样的事情:
def alfa = Action.async(parse.json) { request =>
val p = Promise[Result]
val response = FinagleClient.longRunningComputation(request.body )
val twitterFuture = response.map( rest => Ok("Got result: " + rest ))
twitterFuture.onSuccess(p.success)
twitterFuture.onFailure(p.failure)
p.future
}
我们可以将其概括为隐式将com.twitter.util.Future[A]
转换为scala.concurrent.Future[A]
。
import com.twitter.util.{Future => TwitterFuture}
import scala.concurrent.{Future, Promise}
object TwitterConversions {
def twitter2Scala[A](f: TwitterFuture[A]): Future[A] = {
val p = Promise[A]
f.onSuccess(p.success)
f.onFailure(p.failure)
p.future
}
}
然后你需要在你的控制器中做的就是import TwitterConversions._
(或你把它放进去的任何包)。