我有以下两个功能:
1)
protected def withBagAsync(body: Bag => Future[Result]): Future[Result] = {
//... implementation
}
2)
protected def withBag(body: Bag => Result): Future[Result] =
withBagAsync(body??)
我想重用1
中2
的功能。
但是我不知道该怎么做。
答案 0 :(得分:4)
最直接的实现是这样的:
def withBag(body: Bag => Result): Future[Result] =
withBagAsync(bag => Future.successful(body(bag))
或者,或多或少等效:
def withBag(body: Bag => Result): Future[Result] =
withBagAsync(body.andThen(Future.successful))
您需要将Bag => Result
转换为Bag => Future[Result]
,最简单的方法是组合给定的Bag => Result
和Result => Future[Result
函数,以及{{ 1}}是一个Future.successful
函数,可以在成功的将来包装参数。
如果A => Future[A]
的{{1}}参数可能因异常而失败,或者如果您需要在另一个线程中执行它,等等,那么您可能需要这样的东西:
body
现在,调用者可以隐式或显式提供执行上下文,并且withBag
引发的任何异常都将在失败的将来被捕获。
答案 1 :(得分:0)
处理此问题的一种可能方法是使withBagAsync
方法认为它正在接收函数而不是值,而一种简单的解决方案是将调用设为
protected def withBag(body: Bag => Result): Future[Result] =
{
val function: Bag => Future[Result] = (body: Bag) => Future.successful(Result())
withBagAsync(function)
}