Построить scala / akka Future из обратного вызова - PullRequest
1 голос
/ 07 февраля 2012

У меня есть такой пример кода

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

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

Как можно построить Future [Validation [String, 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
}

1 Ответ

4 голосов
/ 07 февраля 2012

Для 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())
...