Pergunta

Tenho duas funções que estão funcionando conforme o esperado

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

Agora quero definir uma terceira função (def getAll: Promise[JsValue]) que chama getSomething e então com base na resposta retorne a resposta ou getSomethingElse e anexe sua resposta ao original.

Atualmente tenho getAll definido da seguinte forma:

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

Isso funciona, mas queria saber se havia uma maneira mais curta de realizar a mesma coisa que fosse um scala mais canônico?

Foi útil?

Solução

Recebi uma resposta de Derek Williams no postagem cruzada no Play Frameworks Google Group.

A única coisa que vejo lá que não é ideal é a correspondência de padrões em Option; em vez disso, usar map/getOrElse oferece um pouco mais de liberdade para compor melhor.Além disso, se você não for usar algum valor, é melhor não dar um nome a ele e usar _

def getAll: Promise[JsValue] = {
  getSomething flatMap { response =>
    (response \ "someAttribute").asOpt[String] map { _ =>
      getSomethingElse map (response ++ _)
    } getOrElse {
      Promise pure response
    }
  }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top