从Scala Future返回值

从Scala Future返回值,scala,functional-programming,flatmap,Scala,Functional Programming,Flatmap,在下面的代码中,我尝试执行两个操作。一个是在数据库中创建客户,另一个是在数据库中创建事件。事件的创建取决于用户的创建 我是Scala的新手,对未来的角色感到困惑。我试图查询数据库,看看用户是否在那里,如果不在,就创建用户。下面的代码用于检查用户是否存在customerByPhone()函数,如果不存在,则进入createUserAndEvent()函数 它实际做的是跳过customerByPhone的响应,直接进入createUserAndEvent()。我认为通过使用平面图,程序将自动等待响应

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

我是Scala的新手,对未来的角色感到困惑。我试图查询数据库,看看用户是否在那里,如果不在,就创建用户。下面的代码用于检查用户是否存在
customerByPhone()
函数,如果不存在,则进入
createUserAndEvent()
函数

它实际做的是跳过
customerByPhone
的响应,直接进入
createUserAndEvent()
。我认为通过使用平面图,程序将自动等待响应,而不必使用
wait.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))
}

您不需要使用wait.result或任何其他阻塞。事实上,您已经从customerByPhone获得了结果,您只是用x忽略了它。我想你想要的是这样的:

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

只有当客户不在时,您才需要编写逻辑代码来执行某些操作。

您不需要使用wait.result或任何其他阻塞。事实上,您已经从customerByPhone获得了结果,您只是用x忽略了它。我想你想要的是这样的:

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

<>你需要对逻辑进行编码才能在客户不在那里做某事。

我会考虑从你的数据库中寻找UpSert支持。也许您的DB库有本地支持。我会考虑从您的数据库中查找UpSert支持。也许您的DB库具有本机支持。顺便说一句,这是一个与您在本主题上的两个答案相似的答案,尽管没有讨论onComplete。顺便说一句,这是一个与您在本主题上的两个答案相似的答案,尽管没有讨论onComplete。