Что не так с этим кодом? Почему я вижу только один вывод? Что возвращает функция 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)
может кто-нибудь объяснить?
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
, просто забудьте, что он когда-либо существовал.
Кажется, это работает в Scastie: scastie.scala-lang.org/BalmungSan/w8XvRTz0S76atNwYwVn9Mw - Хотя я поменял
App
на правильныйmain
, так какApp
имеет много проблем, возможно, из-за этого.