我在我的一个控制器中有这个代码:
def addPayment(id:String, amount:String) = Action.async(implicit request =>
User.isBalanceRecordExisting(id).flatMap{
yesOrNo => yesOrNo match{
case true => User.getCurrentPaymentBalance(id).flatMap(
balance => User.updatePayment(id, balance + amount.toDouble)
).flatMap(
result => User.putBonus(id, amount.toDouble, 1)
).map(result => Redirect(routes.Application.userBonuses()))
case false => User.addPayment(id, amount.toDouble).flatMap(
result => User.putBonus(id, amount.toDouble, 1)
).map(result => Redirect(routes.Application.userBonuses()))
}
}
)
所以逻辑很简单:我检查数据库中是否有记录,如果不存在,我添加它,如果它在那里,那么我更新它。在那之后,我在两种情况下都重复完全相同的行动链。 所以我很高兴在这两个流程中我都有重复的代码。是否有简洁明了的方法来简化这个? 所有业务逻辑方法都有一些Future [T]返回类型。
答案 0 :(得分:2)
实际上,你没有使用添加/更新的结果,但为了保持你的逻辑:
def addPayment(id:String, amount:String) = {
def processResult[T](result: T) = User.putBonus(id, amount.toDouble, 1))
.map(result => Redirect(routes.Application.userBonuses()))
Action.async(implicit request => User.isBalanceRecordExisting(id) flatMap {
case true => User.getCurrentPaymentBalance(id) flatMap {
balance => User.updatePayment(id, balance + amount.toDouble)
} flatMap processResult
case false => User.addPayment(id, amount.toDouble) flatMap processResult
}
)
}
已更新