首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在进行webservice调用时将诺言[Option[Model]]转换为承诺[Option[String]]

在进行webservice调用时将诺言[Option[Model]]转换为承诺[Option[String]]
EN

Stack Overflow用户
提问于 2013-10-12 08:56:53
回答 1查看 108关注 0票数 0

我有两个网络服务电话。Webservice1返回Promise[OptionModel],Webservice2应该以Model作为参数,然后返回Promise[OptionString]。这就是我如何构造代码的方式:

代码语言:javascript
运行
复制
  def call1: Promise[Option[Model]] = for {
    response1 <- callService1(requestHolderForService1)
  } yield {
    for {
      response <- response1
    } yield ParserForResponse(response)
  }

之后,我希望将调用链接到服务2,该服务将服务1的结果作为参数:

代码语言:javascript
运行
复制
   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将这两个调用链接在一起吗?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-14 09:02:13

“正常”的方式不是直接处理承诺,而是那些承诺的未来,您可以从scala.concurrent.Promise.future访问这些承诺。

首先,你映射未来,把它想象成当选项到达的时候,用它进行这个转换,然后你需要处理这个选项可能不存在的事实,这也是一个地图,把它想象成它上的这个转换有一个值。

因此:

代码语言:javascript
运行
复制
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服务调用中使用它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19332423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档