Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 组合两个观察值,然后变换结果_Angular_Http_Rxjs_Flatmap - Fatal编程技术网

Angular 组合两个观察值,然后变换结果

Angular 组合两个观察值,然后变换结果,angular,http,rxjs,flatmap,Angular,Http,Rxjs,Flatmap,我有一个REST端点,我正在使用Http调用它。 我需要链接两个调用,然后使用每个调用的结果创建一个要返回的对象 伪代码: 将新实体发布到服务器并获取UID 使用返回的UID将实体内容修补到服务器 创建一个结合实体内容和UID的对象 将对象返回给调用方(订阅) 我以为这样就可以了,但我犯了一个错误 addClient(clientData) { let clientUid; return this.http.post(`/clients`, clientData) .f

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

伪代码:

  • 将新实体发布到服务器并获取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:您提供了一个无效的对象,其中应该有一个流。您可以提供一个可观察的、承诺的、数组的或可观察的

我怎样才能:

  • 修复错误并让addClient返回我想要的对象
  • 还有,有没有一种方法可以在最终平面图中使用UID,而不必设置局部变量(clientUid)

    • 函数
      .flatMap
      希望您返回一个
      可观察的
      ,但实际上您返回的是一个对象

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


      关于使用
      clientUuid
      ,由于您的
      map
      是从原始
      flatMap
      中调用的,您应该能够使用
      newClient.name

      您的代码中有一些错误和改进

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

    • 我已经为您的问题创建了一个演示-。

      flatMap
      希望您返回一个可观察的。但是你返回了一个对象。相反,你应该用
      .map
      来表示这个bitDoh!实际上,我是从地图开始的,但后来改为解决另一个问题。把它改回去确实有效。谢谢。@user184994如果您添加答案,我会将其标记为已接受。如果你对第二点有任何想法,那也会很有帮助。