A または Promise[A] を指定して単一の Promise[A] を返すにはどうすればよいですか?

StackOverflow https://stackoverflow.com//questions/12699929

質問

期待どおりに動作する関数が 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
      }
    }
  }
}

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

役に立ちましたか?

解決

デレク・ウィリアムズから返事が来た Play Framework Google グループでのクロスポスト.

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

def getAll: Promise[JsValue] = {
  getSomething flatMap { response =>
    (response \ "someAttribute").asOpt[String] map { _ =>
      getSomethingElse map (response ++ _)
    } getOrElse {
      Promise pure response
    }
  }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top