从Scala Future返回值

时间:2017-03-12 23:14:00

标签: scala functional-programming flatmap

在下面的代码中,我尝试进行两项操作。一,在db中创建客户,另一个在db中创建事件。事件的创建取决于用户的创建。

我是Scala的新手,在这里对期货的作用感到困惑。我试图查询数据库并查看用户是否在那里,如果没有,则创建用户。下面的代码应该检查用户是否存在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))
}

1 个答案:

答案 0 :(得分:2)

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

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

只有当客户不在那里时,您才需要对逻辑进行编码以执行某些操作。