0

我有两个网络服务调用。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 返回 aPromise[Option[Model]]而 call2 的返回需要是Promise[Option[String]]。问题源于中间服务调用

呼叫服务2

哪个返回Promise[Option[JsValue]],我无法弄清楚从Promise[Option[Model]] -> Promise[Option[JsValue]] -> Promise[Option[String]]

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

谢谢

4

1 回答 1

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 服务调用中使用它

于 2013-10-14T09:02:13.107 回答