#scala
#scala
Вопрос:
Когда я использую Scala futures, я чувствую замешательство относительно того, должен ли я возвращать future или возвращать Try. Поскольку мой код может завершиться ошибкой, поэтому я ожидаю вернуть попытку, которая может иметь успех или неудачу, и пользователь функции мог бы использовать функцию для создания будущего.
Ответ №1:
Future
s может завершиться сбоем, да, но этот сбой является автономным — он не будет распространяться на остальную часть вашего кода. Future
очень похоже на Try
в этом смысле, и фактически значение, которое оно содержит, является Option[Try[T]]
.
Итак, когда вы map
a Future
, вы будете обрабатывать только Success
случай it’s value
, и если вы хотите обработать сбои, вы можете использовать recover
или recoverTo
.
Future
функции обратного вызова также имеют дело с Try
напрямую:
Future(...).onComplete {
case Success(value) => ...
case Failure(throwable) =>
}
Придерживайтесь этого, Future
когда вам нужны асинхронные результаты, поскольку он все равно использует Try
внутренне.
Комментарии:
1. Поэтому просто возвращайте def something() = future { } всегда, поскольку внутри него есть Try.
Ответ №2:
Если вы хотите получить свой результат асинхронно, вам следует использовать Future
. Future
имеет 2 типа результатов: Success
и Failure
, которые, как вы знаете, являются потомками Try, так что в любом случае вы поймаете сбой, если это произойдет.
Комментарии:
1. «которые, как вы знаете, являются потомками Try»: ошибка, что?
2. смотрите ответ LimbSoup
3. Забудьте об этом, я почему-то думал, что вы говорили, что
Future
является «потомком»Try
. Возможно, мне понадобится еще немного сна.
Ответ №3:
Допустим, я разрабатывал еще один API-интерфейс actor. Что я должен использовать для типа результата отправки? Если я хочу, чтобы клиенты моего кода возвращались к своему бизнесу, насколько это возможно (другими словами, тип отправки «запустить и забыть») и обрабатывали ответ где-нибудь в будущем, я бы выбрал Future
. Если я хочу заблокировать, пока не придет ответ, я выберу Try
.
Надеюсь, это немного проясняет ситуацию для вас.