从Scala中的JSON返回值(akka和spray)

lnvxswe2  于 2022-11-06  发布在  Scala
关注(0)|答案(1)|浏览(176)

我不知道该说些什么。第二天,我尝试从JSON对象中获取值,同时使用了许多Scala库。这个是Akka,其中包含spray。我尝试将id保存到变量中,并从函数/方法中返回它。对于我来说,它是否为Future并不重要,但我被int = for {lel <- ss} yield lel这个语句卡住了。无论我尝试什么,我总是得到int的初始值,无论它是一个类,case类,Future[Int]还是Int。请给出建议。

scala> def queryLocation(location: String): Future[Int] = {
     | var int: Any = Future{0} ; val locUri = Uri("https://www.metaweather.com/api/location/search/").withQuery(Uri.Query("query" -> location))
     | 
     | val req = HttpRequest(uri = locUri, method = HttpMethods.GET);val respFuture = Http().singleRequest(req);
     | respFuture.onComplete{
     | case Success(value) => {
     | val r = Unmarshal(value).to[Seq[Search]]
     | val ss = for { reich <- r  } yield reich(0).woeid
     | int =  for {lel <- ss} yield lel
     | }
     | }
     | int.asInstanceOf[Future[Int]] }
       respFuture.onComplete{
                            ^
On line 5: warning: match may not be exhaustive.
       It would fail on the following input: Failure(_)
def queryLocation(location: String): scala.concurrent.Future[Int]

scala> Await.result(queryLocation("Warsaw"), 1.second)
val res221: Int = 0
xzlaal3s

xzlaal3s1#

问题在于,你创造了一个被急切执行的未来:

var int: Any = Future{0}

我在这里看到了不同的问题:
1.不要使用var。A Future是一个异步计算,在其中修改任何东西都没有意义。
1.为什么要将变量声明为Any?它是一个Future。
这是为了理解:

int =  for {lel <- ss} yield lel

看起来很糟糕。可能是因为Scala future不是引用透明的。所以要避免这种情况。如果你想反序列化响应的内容,只需使用map

val future = HttpRequest(uri = locUri, method = HttpMethods.GET).map(content => Unmarshal(value))

Await.result(future, 1.second)

相关问题