2016-12-23 4 views
2

Вот пример из scaladoc для andThen:имеют смысл этого примера andThen

val f = Future { 5 } 
f andThen { 
    case r => sys.error("runtime exception") 
} andThen { 
    case Failure(t) => println(t) 
    case Success(v) => println(v) 
} 

не ли не линия case r => sys.error("runtime exception") сгенерирует исключение независимо от того, что будущее в конце концов быть? На самом деле это не имеет никакого смысла, но, может быть, я что-то пропустил.

ответ

3

Да, это исключение, независимо от того, каким будет будущее.

Бросание исключения может служить сообщением для потока, в котором выбрано исключение.

Вообще,

andThen используется для выполнения каких-то стороны, влияющего код после того, как данное будущее завершено и типа результата операции после andThen является результатом того же исходного будущегокиевстар. Таким образом, вы можете сопоставить шаблон и ожидать того же результата, что и в оригинальном будущем.

В вашем случае сторона, осуществляющей операции бросает исключение, но это может быть любой другой полезной стороне осуществления операции, как при записи в файл, закрывая ресурсы и т.д.

Вот реализация andThen из стандартной библиотеки Scala.

andThen Используется для запуска какой-либо операции, выполняющей побочные действия, после того, как будущее, на которое оно вызывается, завершено, но вещь, которую следует отметить, является результатом, который будет представлять собой всю операцию, с будущим с исходным будущим результатом.

def andThen[U](pf: PartialFunction[Try[T], U])(implicit executor: ExecutionContext): Future[T] = { 
    val p = Promise[T]() 
    onComplete { 
     case r => try pf.applyOrElse[Try[T], Any](r, Predef.conforms[Try[T]]) finally p complete r 
    } 
    p.future 
    } 

Уведомление после andThen операции будущего с результатом первоначального будущего возвращается.

Как сказал @ Ювал Ицхаков, вы можете использовать его для исключения исключений в основной поток. Но в целом он используется для побочного эффекта после завершения будущего.

1

не ли не линия case r => sys.error("runtime exception") бросить исключение независимо от того, что будущее в конце концов быть?

Да, это так. Но нужно помнить, что исключения, которые выбрасываются внутри Future, автоматически не перебрасываются в основной поток выполнения, их нужно обрабатывать и возвращать из основного потока для завершения программы.

Все andThen позволяет вам выполнить некоторый метод побочного действия в порядке и продолжить составление фьючерсов. Существует множество вещей, которые могут потребовать побочного эффекта, например, обработки открытых ресурсов. Если вы хотите составить фьючерсы, я бы пошел с Future.map.