我不知道该说些什么。第二天,我尝试从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
1条答案
按热度按时间xzlaal3s1#
问题在于,你创造了一个被急切执行的未来:
我在这里看到了不同的问题:
1.不要使用var。A Future是一个异步计算,在其中修改任何东西都没有意义。
1.为什么要将变量声明为Any?它是一个Future。
这是为了理解:
看起来很糟糕。可能是因为Scala future不是引用透明的。所以要避免这种情况。如果你想反序列化响应的内容,只需使用map: