【发布时间】:2012-10-02 03:05:51
【问题描述】:
我正在同时学习 scala、play 和 Web 服务,所以请耐心等待。我已经建立了一个小聚合服务,它结合了天气网络服务和谷歌的地理编码和地点网络服务。我有一些工作,但我对处理错误的正确方法有点困惑。 (我把代码贴在文末)
所以地方 api 使用纬度/经度,所以我使用地理编码 api 从邮政编码中获取纬度/经度。在处理来自对地理编码 api 的调用的响应时,我最终得到一个 (Option[String], Option[String])(保存在 maybeLoc val 中)。在检查maybeLoc 的匹配语句中,如果它最终是(None, None),我会返回Promise(),因为我需要从flatmap 调用中返回Promise。
对此我有两个问题:
1.) 在其中一个 flatMap 或 map 调用中无法进行任何进一步处理的情况下,正确的处理方法是什么?它要求我返回一个承诺,但创建一个空的Promise,当我去赎回时它会超时,这似乎是一个非常糟糕的主意。
2.) 我是否正确假设调用Promise() 会生成一个空的承诺对象,在尝试赎回它时总是会超时?我真的无法从 scaladoc 中分辨出来,也无法从 google 中找到任何关于它的信息。
我希望我的问题对你有意义并且足够清楚。代码如下:
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)
)
}
}
}
【问题讨论】: