Reputation: 9734
I have such code example
val request: Defered[Int] = client.getSomeIntAsynFromSocket();
request.addCallBack(result => result.success[String])
request.addErrback(error => error.fail[Integer])
How is it possible to construct Future[Validation[String, Int]] from defered 'request' and available callbacks
==============================================
Solution from my own:
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
}
Upvotes: 1
Views: 457
Reputation: 26579
For Akka 2.x, put the method below somewhere you can reuse it by import.
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())
Upvotes: 4