从 Scala Future 返回值
Returning value from a Scala Future
在下面的代码中,我尝试执行两个操作。一是在数据库中创建客户,二是在数据库中创建事件。事件的创建依赖于用户的创建。
我是 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))
}
您不需要使用 Await.result 或任何其他屏蔽。事实上,您确实从 customerByPhone 获得了结果,您只是使用 _ 忽略了它。我想你想要的是这样的:
customerByPhone(phoneNumber)
.flatMap(customer => {
if(customer == null)
createUserAndEvent(phoneNumber, creationReason, 1.0)
else
Future(customer)
})
您需要编写逻辑代码,以便仅在客户不在时才执行某些操作。
在下面的代码中,我尝试执行两个操作。一是在数据库中创建客户,二是在数据库中创建事件。事件的创建依赖于用户的创建。
我是 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))
}
您不需要使用 Await.result 或任何其他屏蔽。事实上,您确实从 customerByPhone 获得了结果,您只是使用 _ 忽略了它。我想你想要的是这样的:
customerByPhone(phoneNumber)
.flatMap(customer => {
if(customer == null)
createUserAndEvent(phoneNumber, creationReason, 1.0)
else
Future(customer)
})
您需要编写逻辑代码,以便仅在客户不在时才执行某些操作。