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