Запуск функции, которая возвращает Try асинхронно - PullRequest
4 голосов
/ 30 июня 2019

Предположим, у меня есть foo: A => Try[B] и я хочу запустить его асинхронно с Future, например ::100100

import scala.util.Try
import scala.concurrent.{Future, ExecutionContext}

def foo(s: String): Try[Int] = Try(s.toInt)
def futureFoo(s: String)(implicit ec: ExecutionContext): Future[Int] = Future(foo(s).get)

Поскольку я не люблю использовать get метод, я переписываю futureFoo так:

def futureFoo(s: String)(implicit ec: ExecutionContext): Future[Int] =
  Future(foo(s)).flatMap(Future.fromTry)

Имеет ли это смысл? Есть ли какая-то вспомогательная функция, которую я пропустил, которая делает именно это?

1 Ответ

3 голосов
/ 30 июня 2019

Подумайте о том, чтобы сделать значение get более явным, сложив Try примерно так:

Future(foo(s).fold(throw _, identity))

, однако было бы безопасно вызывать get внутри Future, несмотря на то, что это эстетически раздражает,

Future(foo(s).get)

, поскольку Future внутренне использует Try для обработки бросков в любом случае.Например,

def foo(s: String): Try[Int] = Try(throw new RuntimeException("boom!"))
def futureFoo(s: String): Future[Int] = Future(foo(s).get)
futureFoo("foo") andThen { case e => println(e) }

вывод

Failure(java.lang.RuntimeException: boom!)
...