我正在同时学习 scala、play 和 web 服务,所以请耐心等待。我已经建立了一个小聚合服务,它结合了天气网络服务和谷歌的地理编码和地点网络服务。我有一些工作,但我对处理错误的正确方法有点困惑。(我把代码贴在文末)
所以地方 api 使用纬度/经度,所以我使用地理编码 api 从邮政编码中获取纬度/经度。在处理来自对地理编码 api 的调用的响应时,我最终得到一个(Option[String], Option[String])
(保存在maybeLoc
val 中)。在检查的 match 语句中maybeLoc
,如果它最终是(None, None)
,我会返回,Promise()
因为我需要Promise
从 flatmap 调用中返回 a 。
我对此有两个问题:
1.) 在这些 flatMap 或 map 调用之一中处理无法进行任何进一步处理的情况的正确方法是什么?它需要我回报一个承诺,但是Promise
当我去赎回它时,做一个只会超时的空似乎是一个非常糟糕的主意。
2.)我是否正确地假设调用Promise()
做一个空的承诺对象,在尝试赎回它时总是会超时?我真的无法从 scaladoc 中分辨出来,也无法从谷歌找到任何关于它的信息。
我希望我的问题对你有意义并且足够清楚。这是代码:
def bothAsJson(zipcode:String) = Action {
val promiseOfLoc = Geocode.buildUrlFor(zipcode).get()
val promiseOfWeather = Weather.buildUrlFor(zipcode, "json").get()
val result = promiseOfLoc.flatMap { locResp =>
val maybeLoc = Geocode.extractLocation(locResp.body.toString())
maybeLoc match {
case (Some(lat), Some(lng)) => {
val promiseOfPlaces = Places.buildUrlFor(lat,lng).get()
promiseOfPlaces.flatMap { placesResp =>
promiseOfWeather.map { weatherResp =>
(weatherResp.body.toString(), placesResp.body.toString())
}
}
}
case _ => Promise()
}
}
Async {
result.orTimeout("Timeout!", 2000).map {response =>
response.fold(
result => Ok("Got:\n\nweather:\n" + result._1 + "\n\nplaces:\n" + result._2),
timeout => InternalServerError(timeout)
)
}
}
}