Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Scala中返回future之前记录future的值_Scala - Fatal编程技术网

在Scala中返回future之前记录future的值

在Scala中返回future之前记录future的值,scala,Scala,这就是我目前的做法。要提供更多上下文,请执行以下操作: 当发出请求时,该函数在API中被调用,我希望在返回请求中计算的值之前打印日志消息。这就是为什么,以下对我来说不是一个好的解决方案: def returnFuture[A](x: A): Future[A] = { val xFuture = Future { x } // suppose an API call that returns a future xFuture.flatMap(x => {

这就是我目前的做法。要提供更多上下文,请执行以下操作:

当发出请求时,该函数在API中被调用,我希望在返回请求中计算的值之前打印日志消息。这就是为什么,以下对我来说不是一个好的解决方案:

def returnFuture[A](x: A): Future[A] = {
      val xFuture = Future { x } // suppose an API call that returns a future
       xFuture.flatMap(x => {
            println(x) // logging the value of x
            xFuture
        })
    }

您可以使用
onComplete
回调:

def returnFuture[A](x: A): Future[A] = {
      val xFuture = Future { x } // suppose an API call that returns a future
       xFuture.map(x => {
            println(x) // logging the value of x
        })
      xFuture
    }
地图也会起作用:

def returnFuture[A](x: A): Future[A] = {
  val f = Future { x }
  f.onComplete(println)
  f
}
请记住,使用
Futures
的全部意义在于,您试图避免阻塞,并且无法准确控制
Futures
的执行时间。因此,如果您想要更详细的日志,同时保持
未来的异步特性
,请执行以下操作:

def returnFuture[A](x: A): Future[A] = {
  Future { x }.map { v =>
    println(v)
    v
  }
}

换句话说,如果这是一个选项,则将日志添加到
x
操作中。

日志记录是一个副作用,这意味着您不希望在日志记录由于任何原因(例如调用
toString
抛出NPE)失败时操作失败

非常适合这个用例。从文档中:

将副作用函数应用于此未来的结果,并使用此未来的结果返回一个新的未来

此方法允许强制回调按指定顺序执行

请注意,如果链接的
和第
回调之一抛出异常,则该异常不会传播到后续的
和第
回调。相反,随后的
回调被赋予这个未来的原始值

你的例子变成:

def doSomething(param: String): String = {
  // log something here
  val result = param.toUpperCase
  // log something else here
  result
}

def asFuture(param: String) = Future {
  doSomething(param)
}

`={println(x);Future(x)}`或者我在这里遗漏了什么?@AlekseyIzmailov,不确定你在这里的意思。“处理请求时”与“处理请求前”相同,因为你有一个不可分割的工作单元,你无法控制未来何时执行。如果要在使用
map
flatMap
onComplete
/
成功后打印。您的问题有点让人困惑,因为您要求“在处理请求时”,但显示“处理后,返回值之前”的代码。@AlekseyIzmailov,同意。我应该指定,在处理后计算值之后,但在返回值之前。为Clarity编辑哦,我真傻。我错过了最明显的未来{x}。映射{v=>…}谢谢!
def returnFuture[A](x: A): Future[A] = {
  Future { x } // suppose an API call that returns a future
    .andThen { case Success(v) => println(v) }
}