【发布时间】:2014-12-04 08:06:33
【问题描述】:
我遇到的问题是我将元素存储在 Redis 中。我正在尝试更新可能不存在的元素上的计数器。
我有一个函数可以增加这些值,它的返回类型为
def increment(id: String): Future[Option[Long]]
所以,我打电话来查看 id 是否存在。这具有 Future[Boolean] 的返回类型。如果这个布尔值是 False,那么我想返回 None,并立即完成。但是,如果布尔值为 True,那么我想再调用一次来增加我的值,它的返回类型是 Future[Long]。
这是我尝试过的一些代码:
for {
exists <- redis.hExists(id, index) //returns Future[Boolean]
} yield if (exists) redis.hIncrBy(id, index, 1) //returns Future[Long]
else None
现在我意识到这不起作用,但我不知道如何做到这一点。我可以将 None 包装在 Future 中,然后将整个事情压平,它应该给我一个 Future[Option[Long]],但我觉得必须有更好的方法来处理这类问题。
如果有人需要更多信息,我非常乐意澄清或解释我遗漏的任何内容。谢谢!
【问题讨论】:
-
Future.successful(None)有什么问题? -
我不知道它的存在。谢谢瑞恩。
-
仅供参考,
Future.successful和Future.failed非常有效,因为它们实际上并不涉及ExecutionContext,您不会像使用Future { ... }那样(可能)在线程周围反弹数据. -
很高兴知道。我不敢相信我现在才发现这两个有用的功能。非常感谢瑞恩。我很感激。