【发布时间】:2017-08-02 03:46:44
【问题描述】:
我有以下代码,在我的 findOrCreate() 函数中,我收到一条错误消息,提示 Type mismatch found Unit, required Future[Customer]。在findOrCreate() 内部调用的customerByPhone() 函数也包含期待Futures 的调用,这就是我使用fatmap 的原因。我不知道为什么平面图的结果是Unit。我做错了什么?
override def findOrCreate(phoneNumber: String, creationReason: String): Future[AvroCustomer] = {
//query for customer in db
val avroCustomer: Future[AvroCustomer] = customerByPhone(phoneNumber).flatMap(_ => createUserAndEvent(phoneNumber, creationReason, 1.0))
}
override def customerByPhone(phoneNumber: String): Future[AvroCustomer] = {
val query = Schema.Customers.byPhoneNumber(phoneNumber)
val dbAction: DBIO[Option[Schema.Customer]] = query.result.headOption
db.run(dbAction)
.map(_.map(AvroConverters.toAvroCustomer).orNull)
}
private def createUserAndEvent(phoneNumber: String, creationReason: String, version: Double): Future[AvroCustomer] = {
val query = Schema.Customers.byPhoneNumber(phoneNumber)
val dbAction: DBIO[Option[Schema.Customer]] = query.result.headOption
val data: JsValue = Json.obj(
"phone_number" -> phoneNumber,
"agent_number" -> "placeholder for agent number",
"creation_reason" -> creationReason
)
//empty for now
val metadata: JsValue = Json.obj()
//creates user
val avroCustomer: Future[AvroCustomer] = db.run(dbAction).map(_.map(AvroConverters.toAvroCustomer).orNull)
avroCustomer.onComplete({
case Success(null) => {
}
//creates event
case Success(customer) => {
val uuid: UUID = UUID.fromString(customer.id)
//create event
val event: Future[CustomerEvent] = db.run(Schema.CustomerEvents.create(
uuid,
"customer_creation",
version,
data,
metadata)
).map(AvroConverters.toAvroEvent)
}
case Failure(exception) => {
}
})
Future.successful(new AvroCustomer)
}
【问题讨论】:
-
val语句返回Unit。 -
@Reactormonk 据我所知,val 只是使变量不可变,但您可以返回任何值?
-
val foo: Int = { val bar = 32 }会给你一个编译错误。 -
val创建具有指定值的不可变变量,但它不会像在 C 等语言中那样返回该值。
标签: scala functional-programming future flatmap