2013-10-16 50 views
1

我試圖將ActorRef傳遞給調用客戶端。下面是一些代碼:從scala.concurrent.Future獲取ActorRef [akka.actor.ActorRef]

object Sub { 
    implicit val timeout = Timeout(5 seconds) 
    lazy val default = { 
    val subActor = Akka.system.actorOf(Props[Sub], "sub") 
    subActor 
    } 

    def apply(pChannel: Concurrent.Channel[JsValue]):ActorRef = { 
    (default ? Register(callback)).map { 
     case ref:ActorRef => ref 
    } 
    } 
} 

客戶端調用,這是簡單地調用val sub:ActorRef = Sub(channel)

但是我來到這裏的問題是:

[error] found : scala.concurrent.Future[akka.actor.ActorRef] 
[error] required: akka.actor.ActorRef 

如何修改上面的代碼來獲得一個ActorRef調用代碼來獲得它需要的ref?

回答

2

Future是稍後某個價值的承諾。在這種情況下,Future[ActorRef]是一個表示現在或將來某個時刻的ActorRef的值。

你並不是真的想直接得到ActorRef,你可能想編寫你的調用代碼和未來返回的。

舉例來說,如果你的代碼所做的:

val sub = Sub(channel) 
doSomething(sub) 

你會希望把它改寫爲:

Sub(channel).map { sub => 
    doSomething(sub) 
} 

因爲這將創建一個新的未來自動調用doSomething(sub)sub值可用。您也可以重寫的例子爲:

for(sub <- Sub(channel)) yield doSomething(sub) 

如果您正在尋找在調用代碼塊和返回值可用(這違背阿卡的設計原則時,播放和反應式編程一般的),你可以隨時使用Await,如:

// Await.result() takes a Future[T] and returns a T 
val sub = Await.result(Sub(channel), 10 seconds) 

,但它是設計較差的庫代碼要做到這一點,因此不推薦。在處理的最後階段,你只能等待期貨,即使如此,框架通常也會爲你處理。

+0

我看到await是api.test包的一部分。它也可以在生產代碼上正常工作嗎?對於例如實施長時間輪詢 – Hadesara

+0

Await不屬於api.test。看'scala.concurrent.Await' – yan

+0

對!謝謝你的澄清。 – Hadesara

相關問題