В моем методе1 мне нужно асинхронно вызывать другой метод2, который возвращает Option (result1). Чем, если result1 пуст, мне нужно вызвать другой метод3 асинхронно, но если result1 не пуст, мне просто нужно его вернуть.Scala Future - для понимания, синхронизации микширования и async
Вот метод:
def signIn(username: String): Future[User] = {
for {
foundUser <- userService.findByUsername(username) // this method returns Future[Option[User]],
// foundUser is Option[User]
user <- if (foundUser.isEmpty) {
val newUser = User(username = "User123")
userService.create(newUser).map(Some(_)) // this method returns Future[Option[User]]
}
else
// Here I want to return just foundUser, of course, it is not possible.
// IS THIS APPROACH CORRECT?? DOES THIS LINE CREATE ASYNCHRONOUS CALL?
Future.successful(foundUser)
} yield user
}
Вопрос:
Future.successful(foundUser)
- такой подход правильным в приведенном выше коде? Эта линия создает асинхронный вызов? Если да, то как этого избежать? Я уже выбрал foundUser асинхронно, и я не хочу делать дополнительный асинхронный вызов только для возврата уже полученного значения.
спасибо @Yuval Itzchakov – Teimuraz
кстати, если я пишу будущее {foundUser} вместо Future.successful (foundUser), она выполняется асинхронно, не так ли? – Teimuraz
@moreo Да, это вызовет очередность функции в 'ExecutionContext'. –