كيف يمكنني إرجاع وعد واحد [أ] إعطاء أو وعد [أ]?
-
12-12-2019 - |
سؤال
لدي اثنين من الوظائف التي تعمل كما هو متوقع
def getSomething: Promise[JsValue]
def getSomethingElse: Promise[JsValue]
الآن أريد تحديد وظيفة ثالثة (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
}
}
}
}
يعمل هذا ولكن كان يتساءل عما إذا كانت هناك طريقة أقصر لإنجاز نفس الشيء الذي كان سكالا أكثر قانونية?
المحلول
حصلت على رد من ديريك ويليامز على عبر آخر على اللعب أطر جوجل المجموعة.
الشيء الوحيد الذي أراه هناك غير مثالي هو مطابقة النمط على الخيار ، بدلا من استخدام الخريطة / جيتوريلس يمنحك المزيد من الحرية لتكوين أفضل.أيضا ، إذا كنت لن تستخدم بعض القيمة ، فمن الأفضل عدم إعطائها اسما واستخدامها بدلا من ذلك _
def getAll: Promise[JsValue] = {
getSomething flatMap { response =>
(response \ "someAttribute").asOpt[String] map { _ =>
getSomethingElse map (response ++ _)
} getOrElse {
Promise pure response
}
}
}
لا تنتمي إلى StackOverflow