应该要求'进入未来的内部还是外部?

时间:2018-03-08 00:00:03

标签: scala future

如何在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,并且仍然很难将时间包裹在许多概念中。

非常感谢!

1 个答案:

答案 0 :(得分:1)

只需移除外部Future {...}包装器即可。没有必要。 require调用Future进入Future.failed(...)是没有充分理由的。它实际上更好,因为它会立即(在同一个线程中)向调用者报告参数无效。

顺便说一句,原始代码也是错误的。 {{1}}已创建但未返回。所以基本上它没有做任何事情。