如何在未来的上下文中用require函数替换第一个条件?我是否应该将整个inRange方法包装在一个未来中,如果我这样做了,如何处理最后一个未来,以便它不会返回一个未来[Future[ListUserId],或者有更好的方法?
我有一组代码如下所示:
class RetrieveHomeownersDefault(depA: DependencyA, depB: DependencyB) extends RetrieveHomeowners {
def inRange(range: GpsRange): Future[List[UserId]] = {
// I would like to replace this conditional with `require(count >= 0, "The offset…`
if (count < 0) {
Future.failed(new IllegalArgumentException("The offset must be a positive integer.")
} else {
val retrieveUsers: Future[List[UserId]] = depA.inRange(range)
for (
userIds <- retrieveUsers
homes <- depB.homesForUsers(userIds)
) yield FilterUsers.withoutHomes(userIds, homes)
}
}
}我开始在代码的其他领域使用require函数,但是当我试图在“期货”的上下文中使用它时,我遇到了一些问题。
class RetrieveHomeownersDefault(depA: DependencyA, depB: DependencyB) extends RetrieveHomeowners {
// Wrapped the entire method with Future, but is that the correct approach?
def inRange(range: GpsRange): Future[List[UserId]] = Future {
require(count >= 0, "The offset must be a positive integer.")
val retrieveUsers: Future[List[UserId]] = depA.inRange(range)
// Now I get Future[Future[List[UserId]]] error in the compiler.
for (
userIds <- retrieveUsers
homes <- depB.homesForUsers(userIds)
) yield FilterUsers.withoutHomes(userIds, homes)
}
}如有任何建议、反馈或建议,将不胜感激。我刚刚开始使用“期货”,但我仍然很难理解许多概念。
谢谢一堆人!
发布于 2018-03-08 00:28:23
只需删除外部Future {...}包装器即可。这没必要。require调用没有很好的理由进入Future。从那时起,它会立即(在同一个线程中)向调用方报告该参数无效,这实际上更好。
顺便说一下,原来的代码也错了。创建了Future.failed(...),但没有返回。所以本质上它什么也没做。
https://stackoverflow.com/questions/49163266
复制相似问题