当前位置: 首页 > 知识库问答 >
问题:

在进行 Web 服务调用时将 Promise[Option[Model]] 转换为 Promise[Option[String]]

阳俊德
2023-03-14

我有两个web服务调用。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]]的转换-

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

谢谢


共有1个答案

刘松
2023-03-14

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

首先,您映射未来,将其视为当选项到达时,对其进行此转换,然后您需要处理该选项可能不存在的事实,这也是一个映射,将其视为该转换的值。

所以:

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

 类似资料:
  • 问题内容: 我找到了一个使用Promise的现有库,但是它不使用bluebird。库函数并没有bluebird喜欢或拥有的所有其他功能。如何将“正常”或“非蓝鸟”承诺转换为具有蓝鸟提供的所有其他功能的蓝鸟承诺? 我试过包装在现有的承诺,并和他们俩谁也没工作。 问题答案: 使用-它会占用所有可能的内容,例如来自其他一些实现的承诺,并将其吸收到Bluebird承诺中。 请记住,“解决”一词可能会误导您

  • 问题内容: 我正在使用播放框架和Apache Kafka。 我有一个POST方法,它将消息发送到Kafka。Kafka有一个API方法 public java.util.concurrent.Future send(ProducerRecord记录,回调回调) 其中Javadoc说 异步将记录发送到主题,并在确认发送后调用提供的回调。 我正在使用play框架公开此功能。我想从Controller方

  • 我正在使用play框架和Apache Kafka。 我有一个POST方法,它向Kafka发送消息。Kafka有一个API方法 公共java.util.concurrent。未来发送(生产记录记录、回调) 其中Javadoc说 异步发送记录到主题,并在发送被确认时调用提供的回调。 我将使用play框架公开此功能。我想返回一个<代码>promise

  • 我试着把我的头绕在可观察的物体上。我喜欢Observable解决开发和可读性问题的方式。正如我读到的,好处是巨大的。 HTTP和集合上的可观察对象似乎是直截了当的。我怎样才能把这样的东西转换成可观察的模式呢。 这来自我的服务组件,用于提供身份验证。我希望它能像Angular2中的其他HTTP服务一样工作——支持数据、错误和完成处理程序。 这里的任何帮助都将不胜感激。我唯一的替代解决方案是创建s。但

  • 问题内容: 以下函数从url获取图像并进行加载,然后返回其宽度和高度: 问题是,如果我做这样的事情: 我得到,因为该函数运行但图像尚未加载。 仅当照片已加载且宽度和高度已可用时,如何使用等待/异步返回值? 问题答案: 如何使用/ 将此回调函数转换为Promise? 你不知道与往常一样,您可以使用构造函数。没有语法糖。 仅当照片已加载且宽度和高度已经可用时,如何使用/ 记录值? 你可以做

  • 问题内容: 我想使用Promise,但是我有一个类似以下格式的回调API: 1. DOM加载或其他一次事件: 2.普通回调: 3.节点样式回调(“ nodeback”): 4.带有节点样式回调的整个库: 如何在promise中使用API​​,如何“承诺”它? 问题答案: 承诺有状态,它们从待定状态开始,可以解决: 完成 意味着计算成功完成。 拒绝 表示计算失败。 承诺返回函数 绝不应该抛出,而应该