Question

J'ai deux fonctions qui fonctionnent comme prévu

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

Maintenant, je veux définir une troisième fonction (def getAll: Promise[JsValue]) qui appelle getSomething et puis, sur la base de la réponse soit de renvoyer la réponse ou getSomethingElse et d'ajouter sa réponse à l'original.

J'ai actuellement getAll définis comme suit:

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

Cela fonctionne, mais je me demandais si il y avait un moyen plus court de faire la même chose qui a été plus canonique scala?

Était-ce utile?

La solution

Eu une réponse de Derek Williams sur le cross post sur le Jeu de Cadres du Groupe Google.

La seule chose que je vois qui n'est pas idéal, c'est un patron sur Option, au lieu d'utiliser la carte/getOrElse vous donne un peu plus de liberté pour composer la meilleure.Aussi, si vous n'allez pas utiliser une certaine valeur, il est préférable de ne pas lui donner un nom et à la place utiliser _

def getAll: Promise[JsValue] = {
  getSomething flatMap { response =>
    (response \ "someAttribute").asOpt[String] map { _ =>
      getSomethingElse map (response ++ _)
    } getOrElse {
      Promise pure response
    }
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top