我有一个从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])
提取值的正确方法是什么?
感谢
答案 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,我们永远不会阻止。