سؤال

لدي اثنين من الوظائف التي تعمل كما هو متوقع

  1. def getSomething: Promise[JsValue]
  2. 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
    }
  }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top