私は以下のコードを持っていて、私の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
@ Reactormonk私の知る限り、valは変数を不変にしますが、値を返すことはできますか? – Rafa
'val foo:Int = {val bar = 32}'はあなたにコンパイルエラーを与えます。 – Reactormonk