【问题标题】:Converting Promise[Option[Model]] to Promise[Option[String]] while making webservice calls在进行 web 服务调用时将 Promise[Option[Model]] 转换为 Promise[Option[String]]
【发布时间】:2013-10-12 08:56:53
【问题描述】:

我有两个网络服务调用。 Webservice1 返回 Promise[Option[Model]],Webservice2 应该将 Model 作为参数,然后返回一个 Promise[Option[String]]。这就是我构建代码的方式:

  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]] -&gt; Promise[Option[JsValue]] -&gt; Promise[Option[String]] 的转换

有人可以指出我如何能够使用 map 或 flatMap 将这两个调用链接在一起吗?

谢谢

【问题讨论】:

    标签: web-services scala playframework-2.0 promise monad-transformers


    【解决方案1】:

    “正常”方式不是直接使用 Promise,而是使用这些 Promise 的期货,您可以从 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 服务调用中使用它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 1970-01-01
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多