2

期待どおりに機能する2つの機能があります

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

次に、3 番目の関数 ( def getAll: Promise[JsValue])を定義getSomethingして、応答に基づいて応答を返すか、getSomethingElseその応答を元の関数に追加します。

私は現在getAll、次のように定義しています。

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

これは機能しますが、より標準的なスカラである同じことを達成するためのより短い方法があるかどうか疑問に思っていましたか?

4

1 に答える 1

1

Play Frameworks Google Groupのクロス ポストで、Derek Williams から応答がありました。

理想的ではない唯一の点は、Option でのパターン マッチングです。代わりに、map/getOrElse を使用すると、もう少し自由に構成できるようになります。また、値を使用しない場合は、名前を付けずに _ を使用することをお勧めします

def getAll: Promise[JsValue] = {
  getSomething flatMap { response =>
    (response \ "someAttribute").asOpt[String] map { _ =>
      getSomethingElse map (response ++ _)
    } getOrElse {
      Promise pure response
    }
  }
}
于 2012-10-03T00:43:28.537 に答える