2012-02-07 2 views
1

У меня есть такой код примерConstruct Scala/Akka Будущее от обратного вызова

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

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

Как можно построить будущее [Validation [String, Int]] из defered 'запроса' и доступных обратных вызовов

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

Решение от кого:

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())