2012-02-07 75 views
1

阿卡未來我有這樣的代碼示例構建階/從回調

val request: Defered[Int] = client.getSomeIntAsynFromSocket(); 

request.addCallBack(result => result.success[String]) 
request.addErrback(error => error.fail[Integer]) 

如何有可能構建未來[驗證[字符串,INT]]從延遲執行「請求」和可用的回調

= =============================================

解決方案來自我自己:

val f = Future { 
    val queue = java.util.concurrent.ArrayBlockingQueue[Validation[String, Int]](1) 

    val request: Defered[Int] = client.getSomeIntAsynFromSocket(); 
    request.addCallBack(result => queue.add(result.success[String])) 
    request.addErrback(error => queue(error.fail[Integer])) 

    f.take 
} 

回答

4

Fo r Akka 2.x,將該方法放在某處,您可以通過導入重用它。

def asFuture[T](d: Defered[T])(implicit e: ExecutionContext): Future[T] = { 
    val p = Promise[T]() 
    d.addCallback(r => p tryComplete Right(r)) 
    d.addErrback(e => p tryComplete Left(e)) 
    p.future 
} 

val f = asFuture(client.getIntAsynFromSocket())