我在Scala
中有一个方法,它将返回Future[Either[SecurityScanResponse, ScanResult]]
,但是在写了我的逻辑之后,我得到了所需的Future[Either[SecurityScanResponse, ScanResult]]
,发现了Unit
错误。下面是我的实现。
def calculateScore(penalties: Int): Future[Either[FootballScore, CricketScore]] =
calculatePenalties(penalties).onComplete {
case Success(penalResponse) =>
if(penalResponse.valid) {
findNumberOfMatches().onComplete {
Future.successful(
Left(FootballScore(0, "Valid")))
}
case Failure(ex) =>
log.error("Invalid penalties")
Future.successful(
Left(FootballScore(0, "Invalid")))
}
}
}
这只是假设的代码,但我专注于解决发现Unit
需要Future[Either[FootballScore, CricketScore]]
。
1条答案
按热度按时间qojgxg4l1#
如果您查看Future.onComplete的定义,您会看到以下内容
当这个future通过异常或值完成时,应用提供的函数。
如果future已经完成,则将立即应用或异步调度。
注意,f的返回值将被丢弃。
方法
onComplete
返回一个Unit
。这就是为什么你得到这个错误消息。在文档中有一个
Transformation
部分,它展示了在Future
上应用某些操作的不同方法。根据你所展示的,我认为transform
,transformWith
,map
和flatMap
将是这种情况下的正确选择。不知道如何重写你的代码,因为它有许多没有定义的功能,而且逻辑也很难理解。如果你提供一个minimal reproducible example我可以编辑我的答案添加一些代码作为例子