Странное поведение Scala Future

Что не так с этим кодом? Почему я вижу только один вывод? Что возвращает функция futureUserByName? onComplete тоже не работает. Это должно быть простое будущее, но оно не работает.

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

object FeaturesPromises extends App {
  final case class User(name: String)

  def fetchUser(name:String): User = {
    Thread.sleep(1000)
    User(name)
  }

  def futureUserByName(userName: String): Future[User] = Future {
    Thread.sleep(1000)
    fetchUser(userName)
  }

  Future(fetchUser("John")).foreach(println)
  futureUserByName("Jim").foreach(println)
  Thread.sleep(5000)
}

Вывод >> Пользователь (Джон)

Вывод sbt:

User(John)
[success] Total time: 10 s, completed Jul 5, 2024, 11:28:50 PM
[info] 7. Monitoring source files for root/run...
[info]    Press <enter> to interrupt or '?' for more options.
User(Jim)

может кто-нибудь объяснить?

Кажется, это работает в Scastie: scastie.scala-lang.org/BalmungSan/w8XvRTz0S76atNwYwVn9Mw - Хотя я поменял App на правильный main, так как App имеет много проблем, возможно, из-за этого.

Luis Miguel Mejía Suárez 05.07.2024 21:35
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Application / App всегда был и до сих пор полностью сломан, и

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

Просто используйте вместо этого правильный @main/object FeaturesPromises { ... def main(...) }. Здесь это работает отлично (в Scala 3):

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

// object FeaturesPromises extends App {
final case class User(name: String)

def fetchUser(name:String): User = {
  Thread.sleep(1000)
  User(name)
}

def futureUserByName(userName: String): Future[User] = Future {
  Thread.sleep(1000)
  fetchUser(userName)
}

@main def entry(): Unit = {
  Future(fetchUser("John")).foreach(println)
  futureUserByName("Jim").foreach(println)
  Thread.sleep(5000)
}

В Scala 2 вам пришлось бы создать объект-оболочку с помощью метода main.

Нет веских причин использовать App, просто забудьте, что он когда-либо существовал.

Другие вопросы по теме