我有几个必须向REST API发出GET请求的函数。为了使代码工作,我需要同步进行这些调用,因为我必须传递一些属于前一个响应的参数。
想象一下,我有这个功能:
def getLocations(region: String, key: String): List[(Int, Int, String)] = {
// ************1.*************
val getLocationsURL = url("https://api.transitfeeds.com/v1/getLocations?").GET <<? List("key" -> key)
val response: Future[String] = Http.configure(_ setFollowRedirects true)(getLocationsURL OK as.String)
//Evaluamos respuesta de la página
response onComplete {
case Success(content) => {
//Make json
val json = (parse(content) \\ "results" \\ "locations").children
for (loc <- json) {
//Extract all locations
val locations = loc.extract[List[Locations]]
/*
val countries = (locations.filter(w => w.t.contains(inputCountry))).map((x=> (x.id, x.pid, x.n)))
println(countries) //id, pid, n. Now we already have the list of regions interested in
*/
val regions = (locations.filter(w => w.n.contains(inputRegion))).map((x => (x.id, x.pid, x.n)))
println(regions) //id, pid, n. Now we already have the region interested in (only 1)
finalRegion = regions
}
}
case Failure(t) => {
println("An error has occured: " + t.getMessage)
}
}
return finalRegion
}
现在我需要将finalRegion
的结果插入另一个将发出另一个HTTP GET请求的函数(几乎与上面显示的相同),但是我收到错误,因为第一个未来未完成爱好。
答案 0 :(得分:0)
您在这里要做的是返回尚未计算的结果。函数返回结果后实际调用onComplete
。 (顺便说一下,我认为您已经忘记了初始化您的可变量finalRegion
)
这是在Scala中看到思考的错误方式。我们的想法是转变&#34;例如,使用map
的未来。
如果您有val resp: Future[Response] = ...
,如果您想获取状态代码,您可以执行resp.map(response => response.statusCode)
。表达式的类型为Future[Int]
一旦你有了自己的功能:
def getLocations(region: String, key: String): Future[List[(Int, Int, String)]]
def anotherFunctionWhichReturnsAFuture(locations: List[(Int, Int, String)]): Future[Something]
如果要将第一个函数(getLocations
)的结果传递给第二个函数(anotherFunctionWhichReturnsAFuture
),则会出现问题,因为类型不适合。你想摆脱未来。为此,您可以使用for
。
以下是一个例子:
for {
locations <- getLocations("Maine et Loire", "49")
result <- anotherFunctionWhichReturnsAFuture(locations)
} yield result