在下面的代码中,我尝试进行两项操作。一,在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))
}
答案 0 :(得分:2)
您不需要使用Await.result或任何其他阻止。事实上,你确实有来自customerByPhone的结果,你只是用_忽略了它。我想你想要的是这样的:
customerByPhone(phoneNumber)
.flatMap(customer => {
if(customer == null)
createUserAndEvent(phoneNumber, creationReason, 1.0)
else
Future(customer)
})
只有当客户不在那里时,您才需要对逻辑进行编码以执行某些操作。