【问题标题】:Combine two observables then transform the result合并两个 observables 然后转换结果
【发布时间】:2019-01-25 20:29:01
【问题描述】:

我有一个使用 Angular Http 调用的 REST 端点。 我需要链接两个调用,然后使用每个调用的结果来创建一个要返回的对象。

伪代码:

  • 将新实体发布到服务器并取回 UID
  • PATCH 实体内容到服务器,使用返回的 UID
  • 创建一个结合实体内容和 UID 的对象
  • 将对象返回给调用者(订阅)

我以为这样可以,但我得到一个错误;

addClient(clientData) {
   let clientUid;
   return this.http.post(`/clients`, clientData)
     .flatMap((newClient:any) => {
       clientUid = newClient.name;
       return this.http.patch(`/spec/${clientUid}`, clientData)
       .flatMap((updatedClient:any)=> {
         return {
           uid: clientUid,
           ...updatedClient,
        }
      })
   });
}
//consume
 this.clientService.addClient(clientData)
    .subscribe((response:any) =>{ }

TypeError:您在预期流的位置提供了无效对象。您可以提供 Observable、Promise、Array 或 Iterable。

我该怎么做:

  • 修复错误并让 addClient 返回我想要的对象?
  • 另外,有没有一种方法可以在最终的 flatMap 中使用 UID 而无需设置局部变量 (clientUid)?

【问题讨论】:

  • flatMap 应该返回一个 Observable。但你正在返回一个对象。相反,您应该使用 .map 来表示该位
  • 噢!我实际上是从那里的地图开始的,但为了解决另一个问题而改变了。改回来确实有效。谢谢。
  • @user184994 如果您添加答案,我会将其标记为已接受。如果您对第 2 点有任何想法,那也是最有帮助的。

标签: angular http rxjs flatmap


【解决方案1】:

.flatMap 函数希望您返回 Observable,但实际上您返回的是一个对象。

如果你想转换值,你应该使用.map

关于使用clientUuid,看到你的map是从原来的flatMap中调用的,你应该可以使用newClient.name

【讨论】:

    【解决方案2】:

    您的代码中存在一些错误 + 可以进行改进。

    1. 改进:您不需要嵌套flatmap 调用。
    2. 错误:您不需要第二个flatmap。你需要的是map

    我为您的问题创建了一个演示 - https://stackblitz.com/edit/so-rxjs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多