【问题标题】:Returning value from a Scala Future从 Scala Future 返回值
【发布时间】:2017-08-02 22:04:56
【问题描述】:

在下面的代码中,我尝试执行两个操作。一种是在数据库中创建客户,另一种是在数据库中创建事件。事件的创建,依赖于用户的创建。

我是 Scala 新手,对 Futures 在这里的作用感到困惑。我正在尝试查询数据库并查看用户是否在那里,如果没有,则创建用户。下面的代码应该通过customerByPhone()函数检查用户是否存在,如果不存在,则进入createUserAndEvent()函数。

它实际上在做的是跳过来自customerByPhone 的响应并直接进入createUserAndEvent()。我认为通过使用平面图,程序会自动等待响应,而我不必使用Await.result,不是这样吗?有没有办法避免使用Await.result 不阻塞生产代码上的线程?

override def findOrCreate(phoneNumber: String, creationReason: String): Future[AvroCustomer] =  {
  //query for customer in db
  //TODO this goes into createUserAndEvent before checking that response comes back empty from querying for user
  customerByPhone(phoneNumber)
    .flatMap(_ => createUserAndEvent(phoneNumber, creationReason, 1.0))
}

【问题讨论】:

  • 我会考虑从您的数据库中寻找 upsert 支持。也许你的数据库库有原生支持。

标签: scala functional-programming flatmap


【解决方案1】:

您不需要使用 Await.result 或任何其他阻塞。实际上,您确实有 customerByPhone 的结果,您只是用 _ 忽略了它。我想你想要的是这样的:

customerByPhone(phoneNumber)
  .flatMap(customer => {
    if(customer == null)
      createUserAndEvent(phoneNumber, creationReason, 1.0)
    else
      Future(customer)
   })

只有当客户不在时,您才需要编写逻辑代码来做某事。

【讨论】:

  • 顺便说一句,这与您在此主题上对other question 的两个答案的答案相似,但没有讨论 onComplete。
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 2013-01-24
  • 2016-08-01
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
  • 2016-06-03
相关资源
最近更新 更多