在 Scala 函数中处理副作用和返回值的惯用方法



您将如何构造一个函数,其中你们都想做一个副作用并返回一个值?例如,我想要以下功能:

def futureFromHttpCall: Future[HttpResponse] = 
  doHttpCall.foreach(publishDomainEvent).returnOriginalFuture

(不知何故,我有一种感觉,monads 会出现,所以如果这是这条路,如果那里有解决这个问题的方法,我对猫有点熟悉?

我能想到的最简单的事情是,不要将副作用"隐藏"在Future[T]返回方法中,而是将其作为未来的延续公开:

def futureFromHttpCall: Future[HttpResponse] = doHttpCall

然后你可以onComplete它作为副作用:

futureFromHttpCall.onComplete {
    case Success(_) => publishDomainEvent
    case Failure(e) => // Stuff
}

使效果明确。或者,如果您在Actor系统内,则可以将Future pipeToreceive方法中,并在那里处理成功/失败。

我认为只有当你所有的域事件都被推送时,你的未来才应该完成。他们也应该是一个Future。然后,您可以使用Future.sequence等待所有这些完成,然后再返回。

你的问题有点不清楚,但我认为doHttpCall是某种类型的列表。

def doHttpCall(): Future[Seq[X]] = ???
def publishDomainEvent(x:X): Future[Unit] = ???
def futureFromHttpCall(): Future[Seq[X]] = {
  val firstFuture = ???
  firstFuture.flatMap { xs =>
    val xxs: Seq[Future[Unit]]= xs.map(publishDomainEvent)
    Future.sequence(xxs).map { _ => re }
  }
}

所有这些等待在测试时都非常有用。

相关内容

  • 没有找到相关文章

最新更新