代码之家  ›  专栏  ›  技术社区  ›  user639466

无法在[scala.concurrent.Future]]上获得“pipeTo”方法

  •  4
  • user639466  · 技术社区  · 8 年前

    pipeTo 方法[scala.concurrent.Future]]这样:

    import akka.pattern.pipe
    val future = ...
    future pipeTo sender()
    

    不幸的是,我无法做到这一点,我在IDE中遇到了一个错误“无法解析符号管道”。

    pipe(future) pipeTo sender()
    

    但我仍然不明白为什么(顺便说一句,我对scala很陌生)。非常感谢您帮助理解这个谜题。

    scala 2.12.2 akka 2.5.3

    1 回复  |  直到 8 年前
        1
  •  16
  •   Tyler    8 年前

    你需要有一个 implicit ExecutionContext

    import akka.actor.{Actor, ActorSystem, Props}
    import akka.pattern.pipe
    
    import scala.concurrent.Future
    
    // Get the implicit ExecutionContext from this import
    import scala.concurrent.ExecutionContext.Implicits.global
    
    object Hello extends App {
    
      // Creating a simple actor
      class MyActor extends Actor {
        override def receive: Receive = {
          case x => println(s"Received message: ${x.toString}")
        }
      }
    
      // Create actor system
      val system = ActorSystem("example")
      val ref = system.actorOf(Props[MyActor], "actor")
    
      // Create the future to pipe
      val future: Future[Int] = Future(100)
    
      // Test
      future pipeTo ref
    }
    

    sbt run
    [info] <stuff here>
    [info] Running example.Hello 
    Received message: 100
    

    你必须这么做的原因是 pipeTo 是上的实例函数 PipeableFuture ,和您的常规 Future 必须“增强”到 。这是的构造函数 管道未来 ,注意 implicit executionContext: ExecutionContext 参数:

    final class PipeableFuture[T](val future: Future[T])(implicit executionContext: ExecutionContext)
    

    功能:

    final class PipeableFuture[T](val future: Future[T])(implicit executionContext: ExecutionContext) {
      def pipeTo(recipient: ActorRef)(implicit sender: ActorRef = Actor.noSender): Future[T] = {
        future andThen {
          case Success(r) ⇒ recipient ! r
          case Failure(f) ⇒ recipient ! Status.Failure(f)
        }
      }
      def pipeToSelection(recipient: ActorSelection)(implicit sender: ActorRef = Actor.noSender): Future[T] = {
        future andThen {
          case Success(r) ⇒ recipient ! r
          case Failure(f) ⇒ recipient ! Status.Failure(f)
        }
      }
      def to(recipient: ActorRef): PipeableFuture[T] = to(recipient, Actor.noSender)
      def to(recipient: ActorRef, sender: ActorRef): PipeableFuture[T] = {
        pipeTo(recipient)(sender)
        this
      }
      def to(recipient: ActorSelection): PipeableFuture[T] = to(recipient, Actor.noSender)
      def to(recipient: ActorSelection, sender: ActorRef): PipeableFuture[T] = {
        pipeToSelection(recipient)(sender)
        this
      }
    }
    

    自从 pipe(future)

    推荐文章