【问题标题】:Should 'require' go inside or outside of the Future?“要求”应该在未来的内部还是外部?
【发布时间】:2018-03-08 09:17:18
【问题描述】:

如何在 Future 的上下文中将我的第一个条件替换为 require 函数?我是否应该将整个 inRange 方法包装在 Future 中,如果这样做,我该如何处理最后一个 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,仍然很难理解许多概念。

非常感谢!

【问题讨论】:

    标签: scala future


    【解决方案1】:

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

    顺便说一句,原来的代码也是错误的。 Future.failed(...) 已创建但未返回。所以本质上它没有做任何事情。

    【讨论】:

    • 对原版Future.failed(…)的很好理解,我更正了。
    猜你喜欢
    • 1970-01-01
    • 2011-08-06
    • 2021-01-05
    • 2014-10-28
    • 2018-06-30
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 2019-09-23
    相关资源
    最近更新 更多