0

我有两个webservice调用。 Webservice1返回Promise [Option [Model]],Webservice2应该将Model作为参数,然后返回一个Promise [Option [String]]。这是我已经构建我的代码:在进行web服务调用时将Promise [Option [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) 
     } 
     } 
    } 
    } 

的问题是,我的电话1返回Promise[Option[Model]],而来自电话2的返回需要为Promise[Option[String]]。这个问题从中间服务呼叫茎

callService2

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

有人能指出我如何能够以链这两个调用一起使用map还是flatMap?

感谢

回答

1

“正常”的方式将不直接与承诺合作,但期货这些承诺,你可以从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服务调用中使用

相关问题