Клиент Finagle в Scala Play Controller
Я использую метод (FinagleClient.longRunningComputation) клиента Finagle в моем контроллере
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 в моем игровом контроллере
Как я могу это сделать?
1 ответ
Решение
Вам придется конвертировать в 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._
(или любой другой пакет, в который вы положили).