为什么这个函数链被编译?

时间:2016-05-22 19:16:30

标签: scala

http://backchatio.github.io/hookup/scaladoc/io/backchat/hookup/DefaultHookupClient.html获得此代码:

  new DefaultHookupClient(HookupClientConfig(new URI("ws://localhost:8080/thesocket"))) {

    def receive = {
      case Disconnected(_) ⇒ println("The websocket to " + uri.toASCIIString + " disconnected.")
      case TextMessage(message) ⇒ {
        println("RECV: " + message)
        send("ECHO: " + message)
      }
    }

    connect() onSuccess {
      case Success ⇒
        println("The websocket is connected.")
      case _ ⇒
    }
  }
client.scala中的

https://github.com/backchatio/hookup/blob/2913794eb45d90d65713c9fd631b427abcca2d05/src/main/scala/io/backchat/hookup/client.scalaconnect定义为:

def connect(protocols: String*): Future[OperationResult] = synchronized {
…   
257           delay {
258             connect(wireFormat.get.name)
259           }
260       }
261     }

OperationResult定义为(https://github.com/backchatio/hookup/blob/2913794eb45d90d65713c9fd631b427abcca2d05/src/main/scala/io/backchat/hookup/operation_result.scala):

sealed trait OperationResult {
11    /**
12     * Flag for the java api to indicate success
…   
30    def children: java.util.List[OperationResult] = List[OperationResult]().asJava
31  }

在链式方法connect() onSuccess {中,connect()方法似乎会阻塞,直到调用onSuccess为止?在https://github.com/backchatio/hookup/ onSuccess的源代码中似乎没有定义,所以这个方法链如何编译?

我希望onSuccess在类似于:

的抽象类中定义
abstract class DefaultHookupClient {

  def onSuccess(): Unit

}

2 个答案:

答案 0 :(得分:1)

请安装和使用IDE ... scala是没有IDE的PITA,即使没有IDE也是如此。

方法onSuccessFuture trait in scala.concurent

中定义

再次获得一个IDE。否则,你将进入一个真正非常令人沮丧的旅程。

答案 1 :(得分:1)

latest doc更清楚执行语义。

Since this method executes asynchronously...

不确定为什么你认为它会阻止。那将是邪恶的。

请注意,onSuccess在2.12中已弃用。使用onComplete代替处理所有情况,这是相同的想法:"在未来完成时运行副作用。不要打扰告诉我,我甚至不在乎。"