【问题标题】:Using futures and options to check if element exists in database and updating it使用期货和期权检查数据库中是否存在元素并更新它
【发布时间】: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.successfulFuture.failed 非常有效,因为它们实际上并不涉及 ExecutionContext,您不会像使用 Future { ... } 那样(可能)在线程周围反弹数据.
  • 很高兴知道。我不敢相信我现在才发现这两个有用的功能。非常感谢瑞恩。我很感激。

标签: scala redis future


【解决方案1】:

由于您在该链中的任何位置都没有真正的Option,因此您需要以某种方式插入它。将成功的Future 映射到Some 应该可以。

for {
    exists <- redis.hExists(id, index)
} yield {
   if (exists) redis.hIncrBy(id, index, 1).map(Some(_))
   else Future.successful(None)
}

【讨论】:

  • 谢谢 m-z。 Future.successful(None) 正是我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-30
  • 2013-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
相关资源
最近更新 更多