J'ai le code ci-dessous et dans ma fonction findOrCreate()
, j'obtiens une erreur disant Type mismatch found Unit, required Future[Customer]
. La fonction customerByPhone()
qui est appelée à l'intérieur findOrCreate()
contient également des appels qui attendent Futures, ce qui explique pourquoi j'utilise un fatmap. Je ne sais pas pourquoi le résultat de la flatmap aboutit à Unit
. Qu'est-ce que je fais mal?Type discordance trouvé Unité, requis Futur [Client] sur flatmap
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)
}
Une instruction 'val' renvoie' Unit'. – Reactormonk
@Reactormonk à ma connaissance, un val rend juste la variable immuable, mais vous pouvez retourner une valeur? – Rafa
'val toto: Int = {val barre = 32}' vous donnera une erreur de compilation. – Reactormonk