Scala 地图和平面地图未来[JsValue]

Scala 地图和平面地图未来[JsValue],scala,Scala,我在从将来的[JsValue]中提取字符串值时遇到了问题 我试过地图和平面地图,但我想我做错了什么 我有一个返回Future[JsValue] val chunk: Future[JsValue] = BusinessLogic.Methods.getJsonValue(url) 如果我是地图,我就有了未来[字符串] val next: Future[String] = (chunk.map(_.\("paging").\("next").as[String])) 如果我使用平面贴图,我

我在从将来的[JsValue]中提取字符串值时遇到了问题

我试过地图和平面地图,但我想我做错了什么

我有一个返回Future[JsValue]

 val chunk: Future[JsValue] = BusinessLogic.Methods.getJsonValue(url)
如果我是地图,我就有了未来[字符串]

 val next: Future[String] = (chunk.map(_.\("paging").\("next").as[String]))
如果我使用平面贴图,我会得到类型不匹配

 val next = chunk.flatMap(x=>x.\("paging").\("next").as[String])
提取值的正确方法是什么

谢谢

来自官方教程,关于地图:

一个基本的组合词是map,它在给定未来和未来的情况下 映射函数为未来的价值,产生新的未来 一旦原始未来完成,将使用映射值完成 已成功完成

关于平面图

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

所以在您的例子中,因为您只想将响应转换为其他值,所以您需要一个映射函数,它将您未来的结果映射为字符串

val next: Future[String] = (chunk.map(_.\("paging").\("next").as[String]))
这里的下一个值是chunk的失败或将chunk js值映射到字符串的结果

val next: Future[String] = (chunk.map(_.\("paging").\("next").as[String]))
如果您有一些额外的异步计算,比如

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

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

您需要使用flatMap,将两个相关的异步期货组合在一起。这里的下一个值是计算结果函数,应用于从块返回的结果。

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

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可用时使用该值调用它,我们永远不必阻止它。

提取该值是什么意思?如果你想打开未来,你必须阻止(取决于你想做什么,这可能是个坏主意)
map
将匿名函数的结果包装到另一个未来,
flatMap
需要您将结果包装到未来,在这两种情况下,返回类型都是
future[T]
。我必须从未来获取字符串值,以便将其传递给另一个固定字符串的方法
next.map(使用字符串的其他函数)
我试着这样做,但出现了错误scala递归调用不在尾部位置您可以更具体一点。您尝试了哪一个?您确定递归调用引用的是此映射函数,而不是其他函数吗?这是递归方法def-inner(url:String,commentList:Future[List[JsValue]]):Future[List[JsValue]={val chunk:Future[JsValue]=BusinessLogic.Methods.getJsonValue(url)val jsList:Future[List[JsValue]]=chunk.map(u.(“数据”).as[List[JsValue]]]chunk.flatMap(x=>{val next=x.(“分页”)。(“下一步”).as[String]if(next!=null)inner(next,commentList.flatMap(l=>jsList.map(l2=>l++l2)))else commentList.flatMap(l=>jsList.map(l2=>l++l2))}内部(url,Future.successful(Nil))}