2016-02-25 16 views
0
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 
     }) 
    } 

这是我目前正在做的方式。为了提供更多的上下文:在将其返回到Scala之前记录未来的价值

该功能被调用的API内部时做出请求时,我想要打印的日志消息被返回在请求中计算出的值之前。这是为什么,下面是不是对我来说是很好的解决方案:

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 
    } 
+0

'= {println(x);未来(x)}'或者我在这里错过了什么? –

+0

@AlekseyIzmailov,不知道你在这里的意思。 –

+0

你的情况“而该请求被处理”相同“的请求之前已处理”,因为你有工作的一个不可分割的单位,你不控制当未来将被执行。如果要在使用'map','flatMap'或'onComplete' /'onSuccess'后打印。你的问题有点困惑,因为你要的“而该请求被处理”,而是显示“这是被处理后,返回之前的值”的代码。 –

回答

0

您可以使用onComplete回调:

def returnFuture[A](x: A): Future[A] = { 
    val f = Future { x } 
    f.onComplete(println) 
    f 
} 

的地图将工作太:

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

记住使用Futures的全部意义在于您试图避免阻塞,并且您无法准确控制Future何时执行。所以,如果你想了解更多详细的日志,同时保持一个Future的异步特性,做这样的事情:

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

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

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

+0

哦,傻我。我错过了最明显的未来{X} {.MAP V => ...}谢谢! –