Domanda

Ho due funzioni che funzionano come previsto

    .
  1. def getSomething: Promise[JsValue]
  2. def getSomethingElse: Promise[JsValue]
  3. 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?

È stato utile?

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
    }
  }
}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top