在Scala中返回future之前记录future的值
这就是我目前的做法。要提供更多上下文,请执行以下操作: 当发出请求时,该函数在API中被调用,我希望在返回请求中计算的值之前打印日志消息。这就是为什么,以下对我来说不是一个好的解决方案:在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 => {
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) }
}