Есть ли какие-либо причины использовать Action.async, кроме удобочитаемости в Play Framework? - PullRequest
1 голос
/ 01 ноября 2019

Я прочитал официальный документ действия play async и понимаю, что Action.async - это

просто средство для упрощения создания действий на основе API, которые возвращают Future.

Что меня беспокоит, так это то, что кажется, что вы вводите необработанные ошибки, если вы слепо возвращаете Future [Response], потому что Future может быть Failure.

Конечно, вы можете обрабатывать дело Failure с помощью чего-то вроде

def index = Action.async {
  intensiveComputation()
    .map { i => Ok("Got result: " + i) }
    .recover { case e: Exception => InternalServerError("error")}
}

Но вы также можете использовать Action, написав что-то вроде этого и последовательно используя Action over Action.async. не забудьте обработать ошибку.

def index = Action {
  intensiveComputation().onComplete {
    case Success(i) => Ok("Got result: " + i)
    case Failure(e) => InternalServerError("error")
  }
}

Так что, если я не хочу вводить непредвиденную ошибку, будет ли хорошей практикой всегда использовать Action.apply? Или я что-то упустил?

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

Не беспокойтесь, Play обеспечивает хорошую обработку ошибок .

По сути, есть обработчик ошибок, который упаковывает исключения в соответствии с исключениями HTTP. Например, необработанные ошибки будут исключениями HTTP 500.

Вы также можете предоставить свой собственный обработчик ошибок.

См. Документацию Play для получения дополнительной информации

1 голос
/ 01 ноября 2019

Ответ высокого уровня:

Второй подход даже не скомпилируется, согласно моему пониманию, тип возвращаемого значения onComplete - Unit, и действие Play ожидает Request [AnyContent] => Result (в случае Action) или Request[AnyContent] => Future [Result] (в случае Action.async).

Надеюсь, что поможет.

...