gpt4 book ai didi

scala - 从 Scala 中的 yield 返回特定类型

转载 作者:行者123 更新时间:2023-12-04 02:17:02 26 4
gpt4 key购买 nike

我正在尝试使用一个函数异步调用 3 个单独的 API,并将响应整理到一个 UserDetails 对象中,并将其作为函数的一部分返回。

但是,我遇到的问题是,当我将返回类型显式设置为 Future[UserDetails] 时,它不会编译,因为 yield 的返回不是一个 UserDetails 对象,我不知道如何从中返回我想要的内容。

请注意,我希望返回一个 Future[UserDetails],但推断的返回类型是 Future[Object]

目前我的代码如下:

def getUserDetails(userId: String) = {
usersConnector.getUserById(userId).map {
case Some(user) =>
for {
connections <- connectionsConnector.getAllConnections(user.username) recover {case _ => None}
pendingConnections <- connectionsConnector.getAllPendingConnections(user.username) recover {case _ => None}
userLocation <- userLocationsConnector.getLocationByUsername(user.username) recover {case _ => None}
} yield {
UserDetails(Some(user), connections, pendingConnections, userLocation)
}
case None => UserDetails(None, None, None, None)
}
}

最佳答案

问题在于您的 map 函数中的 case 返回的类型不同。None 情况返回 UserDetails。但是,Some 案例返回一个 Future[UserDetails]。这两种类型的最小上界(least common ancestor)是AnyRef,即Object。因此,map 函数将 Future[Option[User]] 转换为 Future[Object]

有两种方法可以解决这个问题。首先是两个在 None 情况下使用 Future.successful 构造函数:

...
case None => Future.successful(UserDetails(None, None, None, None))
...

现在,生成的 future 具有类型 Future[Future[UserDetails]]。此时你只需要把它压平:

...
}.flatMap(x => x) // add at the end

第二种更优雅的方法是将所有内容都嵌入到 for-comprehension 中:

def getUserDetails(userId: String) = {
def detailsFor(user: Option[User]) = user match {
case Some(user) =>
for {
connections <- connectionsConnector.getAllConnections(user.username) recover {case _ => None}
pendingConnections <- connectionsConnector.getAllPendingConnections(user.username) recover {case _ => None}
userLocation <- userLocationsConnector.getLocationByUsername(user.username) recover {case _ => None}
} yield {
UserDetails(Some(user), connections, pendingConnections, userLocation)
}
case None => Promise.successful(UserDetails(None, None, None, None))
}
for {
user <- usersConnector.getUserById(userId)
userDetails <- detailsFor(user)
} yield userDetails
}

编辑:

请参阅下面 Łukasz 关于在 for-comprehension 中异步启动 future 的评论。

关于scala - 从 Scala 中的 yield 返回特定类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33191505/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com