将Scala Future转换为Twitter Future

9

我使用Finagle作为Web服务器,希望从我的应用程序逻辑中返回Scala-Futures。 当然要以非阻塞方式将scala.concurrent.Future转换为com.twitter.util.Future,该怎么做呢?

3个回答

21

我没有足够的环境来测试这个,但这是我为"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
  }
}

我可以确认这在Finagle 6.33.0仍然可用。谢谢,@Odomontois。 - marcospereira
这只是将 Scala Future 的结果包装在 Twitter Future 中。因此,对返回的 Future 执行的任何操作(例如取消)都不会产生效果。 - rethab

15

8
这里是使用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]]
}

1
我还需要导入一个ExecutionContext import scala.concurrent.ExecutionContext.Implicits.global - suicide

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接