地图和平面图未来[JsValue]

时间:2014-12-01 20:54:21

标签: scala

我有一个从Future [JsValue]

中提取字符串值的问题

我尝试了Map和Flatmap,但我想我做错了......

我有这个方法返回 Future [JsValue]

 val chunk: Future[JsValue] = BusinessLogic.Methods.getJsonValue(url)

如果我是地图,我会得到一个未来[String]

 val next: Future[String] = (chunk.map(_.\("paging").\("next").as[String]))

如果我使用平面地图,我会遇到类型不匹配

 val next = chunk.flatMap(x=>x.\("paging").\("next").as[String])

提取值的正确方法是什么?

感谢

2 个答案:

答案 0 :(得分:0)

http://docs.scala-lang.org/overviews/core/futures.html

从官方教程,关于地图:

  

其中一个基本的组合是map,给定一个未来和一个   映射函数为未来的价值,产生新的未来   一旦原始未来,就完成了映射值   顺利完成。

关于平面地图。

  

flatMap方法采用一个函数将值映射到新的未来g,然后返回一个g完成后完成的未来。

因此,在您的情况下,您只想将响应转换为其他值,您需要一个map函数,它将您未来的结果映射到String。

val next: Future[String] = (chunk.map(_.\("paging").\("next").as[String]))

此处的下一个值是块的失败或将块js值映射到String的结果。

如果你有一些额外的异步计算,比如

def calculations: (x: String): Future[Int] = ...

val next: Future[Int] = chunk.flatMap(js=> {
   val x = js.\("paging").\("next").as[String]
   calculations(x)
})

您需要使用flatMap,将两个依赖的异步期货合二为一。这里的下一个值是计算函数的结果,应用于从块返回的结果。

答案 1 :(得分:0)

如果你想打开你的未来,你必须阻止。这是一个非常糟糕的主意,如果可能应该避免!

def nextFunction(s:String):Unit = ???
val chunk: Future[JsValue] = BusinessLogic.Methods.getJsonValue(url)
val next: String = Await.result(chunk, 1.second)
nextFunction(next)

如上所述,这是一个坏主意!更好的解决方案是:

def nextFunction(s:String):Unit = ???
val chunk: Future[JsValue] = BusinessLogic.Methods.getJsonValue(url)
chunk.foreach(nextFunction)

这基本上会在值可用时立即调用nextFunction,我们永远不会阻止。