我有两个网络服务电话。Webservice1返回Promise[OptionModel],Webservice2应该以Model作为参数,然后返回Promise[OptionString]。这就是我如何构造代码的方式:
def call1: Promise[Option[Model]] = for {
response1 <- callService1(requestHolderForService1)
} yield {
for {
response <- response1
} yield ParserForResponse(response)
}之后,我希望将调用链接到服务2,该服务将服务1的结果作为参数:
def call2:Promise[Option[String]] = call1.flatMap{
optionModel => optionModel.flatMap{
model => callService2(requestHolderForService2(model)).map{
service2Option => service2Option.map{
service2Result => ResultParse(service2Result)
}
}
}
}问题是,我的call1返回一个Promise[Option[Model]],而来自call2的返回需要是Promise[Option[String]]。这个问题源于中间服务调用。
callService2
返回Promise[Option[JsValue]],而我无法计算出从Promise[Option[Model]] -> Promise[Option[JsValue]] -> Promise[Option[String]]转换而来的
有人能指出我如何能够使用map或flatMap将这两个调用链接在一起吗?
谢谢
发布于 2013-10-14 09:02:13
“正常”的方式不是直接处理承诺,而是那些承诺的未来,您可以从scala.concurrent.Promise.future访问这些承诺。
首先,你映射未来,把它想象成当选项到达的时候,用它进行这个转换,然后你需要处理这个选项可能不存在的事实,这也是一个地图,把它想象成它上的这个转换有一个值。
因此:
val future1: Future[Option[Model]] = (...).future
val future2: Future[Option[String]] = future1.map { maybeModel =>
maybeModel.map(model => model.toString) // or hovewer you make it a string
}然后,您可以在第二个web服务调用中使用它。
https://stackoverflow.com/questions/19332423
复制相似问题