【问题标题】:View result of Scala Future for side effects查看 Scala Future 的结果以了解副作用
【发布时间】:2019-12-27 00:46:13
【问题描述】:

我有一个返回Future 的方法。我想根据它记录成功或失败,然后处理结果。在带有流的 Java 中,我会做类似的事情

getCollection().stream().
  peek(e -> System.out.println("element: " + e).
  forEach(e -> doStuff(e))

有没有类似的“窥视”未来的方法?我希望写一些类似的东西

getFuture().
  peek(checkResult).
  onComplete(processResult)

val checkResult: PartialFunction[Try[MyResult], Unit] = {
  case Success(s) => println("Success on " + s)
  case Failure(e) => e.printStackTrace()
}

但我能找到的最好的是

getFuture().
  transform(checkResult).
  onComplete(processResult)

def checkResult(r: [Try[MyResult]) = r match {
  case Success(s) => {
    println("Success on " + s)
    r
  }
  case Failure(e) => {
    e.printStackTrace()
    r
  }
}

我需要手动返回输入。

【问题讨论】:

  • 你不能只是 .map(...) 吗?
  • @sinanspd 不,只有在Future 成功时才会调用。它仍然必须返回原始值。
  • 好吧,从技术上讲,您可以将错误包装在 Either 中,但我认为链接中提供的隐式解决方案更好
  • @sinanspd 不,map 方法只有在 Future 成功时才会被调用,因此如果出现错误,您将无法获得 OP 想要的堆栈跟踪。

标签: scala future side-effects


【解决方案1】:

Future.andThen:https://www.scala-lang.org/api/current/scala/concurrent/Future.html#andThen 就是为了这个目的。

对于您的代码,类似于:

future.andThen(checkResult).onComplete(processResult)

此表达式返回 andThen 操作之前的原始 Future 结果的新 Future。传入 andThen 的操作应该只是副作用,结果将被丢弃。您还可以将几个andThens 串联在一起以执行多种副作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    相关资源
    最近更新 更多