私はscala、play、およびWebサービスを一度に学んでいるので、我慢してください。天気ウェブサービスとグーグルのジオコードを組み合わせてウェブサービスを配置する小さなアグリゲーターサービスを設定しました。何かが機能していますが、エラーを処理する適切な方法について少し混乱しています。(投稿の最後にコードを投稿しました)
したがって、placesapiはlat/ longを使用するので、geocodeapiを使用して郵便番号からlat/longを取得します。ジオコードAPIの呼び出しからの応答を処理するとき、私は( val(Option[String], Option[String])
に保持されている)で終わります。チェックするmaybeLoc
matchステートメント内で、最終的には、フラットマップ呼び出しからを返す必要があるため、戻ります。maybeLoc
(None, None)
Promise()
Promise
これについて2つの質問があります。
1.)これらのflatMapまたはmap呼び出しのいずれかで、それ以上の処理を実行できない場合を処理する正しい方法は何ですか?約束を返す必要がありますが、Promise
償還するときにタイムアウトするだけの空を作るのは本当に悪い考えのようです。
2.)を呼び出すと、Promise()
それを引き換えようとすると常にタイムアウトになる空の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)
)
}
}
}