В Scala futures, должен ли я заставить мои функции возвращать будущее или возвращать попытку?

#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 .

Надеюсь, это немного проясняет ситуацию для вас.