如何在Future的上下文中用require
函数替换我的第一个条件?我是否应该在Future中包装整个 inRange 方法,如果我这样做,我该如何处理最后一个Future,以便它不会返回Future [Future [List [UserId]] ,还是有更好的方法?
我有一段看起来像这样的代码:
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
函数,但是当我尝试在Futures的上下文中使用它时,我遇到了一些小问题。
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)
}
}
任何提示,反馈或建议都将不胜感激。我刚刚开始使用Futures,并且仍然很难将时间包裹在许多概念中。
非常感谢!
答案 0 :(得分:1)
只需移除外部Future {...}
包装器即可。没有必要。 require
调用Future
进入Future.failed(...)
是没有充分理由的。它实际上更好,因为它会立即(在同一个线程中)向调用者报告参数无效。
顺便说一句,原始代码也是错误的。 {{1}}已创建但未返回。所以基本上它没有做任何事情。