Pregunta

Tengo dos funciones que funcionan como se esperaba.

  1. def getSomething: Promise[JsValue]
  2. def getSomethingElse: Promise[JsValue]

Ahora quiero definir una tercera función (def getAll: Promise[JsValue]) que llama getSomething y luego, según la respuesta, devolver la respuesta o getSomethingElse y adjuntar su respuesta al original.

actualmente tengo getAll definido de la siguiente manera:

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

Esto funciona, pero me preguntaba si había una forma más corta de lograr lo mismo que fuera más canónica en Scala.

¿Fue útil?

Solución

Recibí una respuesta de Derek Williams en el publicación cruzada en Play Frameworks Google Group.

Lo único que veo allí que no es ideal es la coincidencia de patrones en Option; en cambio, usar map/getOrElse te da un poco más de libertad para componer mejor.Además, si no vas a utilizar algún valor, es mejor no darle nombre y en su lugar utilizar _

def getAll: Promise[JsValue] = {
  getSomething flatMap { response =>
    (response \ "someAttribute").asOpt[String] map { _ =>
      getSomethingElse map (response ++ _)
    } getOrElse {
      Promise pure response
    }
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top