我使用Finagle作为Web服务器,我想从我的应用程序逻辑返回Scala-Futures . 如何将scala.concurrent.Future转换为com.twitter.util.Future,当然是以非阻塞的方式?
没有足够的环境来测试这个,但这是我为 "com.twitter" %% "finagle-http" % "6.25.0" 写的:
"com.twitter" %% "finagle-http" % "6.25.0"
import com.twitter.{util => twitter} import scala.concurrent.{ExecutionContext, Promise, Future} import scala.util.{Failure, Success, Try} import language.implicitConversions object TwitterConverters { implicit def scalaToTwitterTry[T](t: Try[T]): twitter.Try[T] = t match { case Success(r) => twitter.Return(r) case Failure(ex) => twitter.Throw(ex) } implicit def twitterToScalaTry[T](t: twitter.Try[T]): Try[T] = t match { case twitter.Return(r) => Success(r) case twitter.Throw(ex) => Failure(ex) } implicit def scalaToTwitterFuture[T](f: Future[T])(implicit ec: ExecutionContext): twitter.Future[T] = { val promise = twitter.Promise[T]() f.onComplete(promise update _) promise } implicit def twitterToScalaFuture[T](f: twitter.Future[T]): Future[T] = { val promise = Promise[T]() f.respond(promise complete _) promise.future } }
也可以使用Twitter bijections库:https://github.com/twitter/bijection
即 com.twitter.bijection.twitter_util.UtilBijections (https://github.com/twitter/bijection/blob/develop/bijection-util/src/main/scala/com/twitter/bijection/twitter_util/UtilBijections.scala)
com.twitter.bijection.twitter_util.UtilBijections
此库处理重要的细节,例如,如果您前后转换对象,它只是解开原始对象 .
以下是使用twitter双向库的示例:
import scala.concurrent.{Future => ScalaFuture} import com.twitter.util.{Future => TwitterFuture} // extend values by adding the conversion method "as" import com.twitter.bijection.Conversion.asMethod // pull in various implicit converters that "as" expects, // including twitter2ScalaFuture: import com.twitter.bijection.twitter_util.UtilBijections._ def doSomething: ScalaFuture[T] = { val response: TwitterFuture[T] = ??? response.as[ScalaFuture[T]] }
3 回答
没有足够的环境来测试这个,但这是我为
"com.twitter" %% "finagle-http" % "6.25.0"
写的:也可以使用Twitter bijections库:https://github.com/twitter/bijection
即
com.twitter.bijection.twitter_util.UtilBijections
(https://github.com/twitter/bijection/blob/develop/bijection-util/src/main/scala/com/twitter/bijection/twitter_util/UtilBijections.scala)此库处理重要的细节,例如,如果您前后转换对象,它只是解开原始对象 .
以下是使用twitter双向库的示例: