【发布时间】:2021-03-09 19:10:41
【问题描述】:
在我当前的项目中,我使用Either[Result, HandbookModule](Result 是一个 HTTP 状态码)作为返回类型,以便在出现问题时创建正确的状态。我现在已将我的数据库访问重构为非阻塞。
此更改要求我的数据库访问函数的返回类型更改为Future[Either[Result, HandbookModule]]。
现在我不确定如何将此函数与另一个返回 Either[Result, Long] 的函数粘合在一起。
所以为了更好地说明我的意思:
def moduleDao.getHandbooks(offset, limit): Future[Either[Result, List[Module]] = Future(Right(List(Module(1))))
def nextOffset(offset, limit, results): Either[_, Long] = Right(1)
def getHandbooks(
offset: Long,
limit: Long): Future[Either[Result, (List[HandbookModule], Long)]] = {
for {
results <- moduleDao.getHandbooks(offset, limit)
offset <- nextOffset(offset, limit, results)
} yield (results, offset)
}
在更改之前,这显然没有问题,但我不知道最好的方法是什么。
或者有没有办法将Future[Either[A, B]] 转换为Either[A, Future[B]]?
【问题讨论】:
-
为什么需要改变它?为什么不只是在它有效的情况下计算未来?
-
在我提供的示例中,这是可行的,但我也有一些更复杂的情况。
-
尝试为您的复杂案例创建一个minimal reproducible example,这样会更容易帮助您。
-
好的,我添加了一个更复杂的示例。希望有用
-
您的示例无法编译。
标签: scala functional-programming future either