Come posso restituire una singola promessa [A] data una o promessa [a]?
-
12-12-2019 - |
Domanda
Ho due funzioni che funzionano come previsto
- .
-
def getSomething: Promise[JsValue]
-
def getSomethingElse: Promise[JsValue]
Ora voglio definire una terza funzione (def getAll: Promise[JsValue]
) che chiama getSomething
e quindi in base alla risposta restituisce la risposta o getSomethingElse
e appendono la sua risposta all'originale.
Attualmente ho getAll
definito come segue:
def getAll: Promise[JsValue] = {
getSomething flatMap { response:JsValue =>
(response \ "someAttribute").asOpt[String] match {
case None =>
val resultPromise = Promise[JsValue]
resultPromise.redeem(response)
resultPromise
case Some(someAttribute) => getSomethingElse map { moreResponse:JsValue =>
response ++ moreResponse
}
}
}
}
.
Questo funziona ma mi stava chiedendo se ci fosse un modo più breve per realizzare la stessa cosa che era più canonica Scala?
Soluzione
ha ricevuto una risposta da Derek Williams su Cross Post on PlayFrameworks Google Group .
.L'unica cosa che vedo lì che non è l'ideale è la corrispondenza del modello sull'opzione, invece di usare Map / GetRelese ti offre un po 'più libertà di comporre meglio.Inoltre, se non usi qualche valore, è meglio non dargli un nome e invece usare _
def getAll: Promise[JsValue] = {
getSomething flatMap { response =>
(response \ "someAttribute").asOpt[String] map { _ =>
getSomethingElse map (response ++ _)
} getOrElse {
Promise pure response
}
}
}
.