合并两个可观察值,然后转换结果

时间:2018-08-19 13:55:15

标签: angular http rxjs flatmap

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

伪代码:

  • 将新实体发布到服务器并获取UID
  • 使用返回的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)?

2 个答案:

答案 0 :(得分:1)

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

如果要转换值,则应使用.map

关于使用clientUuid,看到您的map是在原始flatMap中被调用的,那么您应该只能使用newClient.name

答案 1 :(得分:1)

有一些错误+您的代码可以改进。

  1. 改进:您无需嵌套flatmap通话。
  2. 错误:您不需要第二个flatmap。您需要的是map

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