Scala Future-用于理解、混合同步和异步
在method1中,我需要异步调用另一个method2,它返回选项(result1)。然后,如果result1为空,我需要异步调用另一个method3,但如果result1不为空,我只需要返回它 方法如下:Scala Future-用于理解、混合同步和异步,scala,future,for-comprehension,Scala,Future,For Comprehension,在method1中,我需要异步调用另一个method2,它返回选项(result1)。然后,如果result1为空,我需要异步调用另一个method3,但如果result1不为空,我只需要返回它 方法如下: def signIn(username: String): Future[User] = { for { foundUser <- userService.findByUsername(username) // this method returns Futur
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
}
def登录(用户名:字符串):未来[用户]={
为了{
foundUserFuture。成功的
不会在提供的ExecutionContext
上对附加函数进行排队。它只使用创建一个完整的Future[t]
:
/** Creates an already completed Future with the specified result.
*
* @tparam T the type of the value in the future
* @param result the given successful value
* @return the newly created `Future` instance
*/
def successful[T](result: T): Future[T] = Promise.successful(result).future
作为旁注,您可以使用选项减少样板文件的数量。折叠:
def signIn(username: String): Future[User] =
userService
.findByUsername(username)
.flatMap(_.fold(userService.create(User(username = "User123")))(Future.successful(_))
@Yuval Itzhakov回答了您的问题,但作为补充说明,您可能希望在您的案例中直接使用带模式匹配的flatMap
。我个人认为它更具可读性:
def signIn(username: String): Future[User] =
userService.findByUsername(username)
.flatMap {
case Some(user) => Future.successful(user)
case _ => userService.create(User(username = "User123"))
}
顺便说一下,如果我编写Future{foundUser}而不是Future.successful(foundUser),它是异步执行的,对吗?@moreo是的,它会导致函数在ExecutionContext
上排队。谢谢,我先用flatMap实现了它,但是我这里的示例与我原来的方法相比非常简化,我有很多嵌套的flatMaps/maps,这就是为什么我决定重写它以供理解