繁体   English   中英

Angular Map 和 mergeMap rxjs6 运算符

[英]Angular Map and mergeMap rxjs6 operators

新手问题:

我正在尝试将我的数据从 rest API 导出到 firebase。

我将Angular6RxJS 6 一起使用

getByTag(tag:string) {
  return this.http.get(this.URL + '/get/listings/', { headers })
    .pipe(
      map((res: Listings) => res.items),
      // How do I add an additional property to each of these items? eg res.items.inserted = new Date();
      // How do chain each of these res.items to another function called exportToFirebase(res.item))
    );
}

我的数据看起来像这样: https : //pasteboard.co/HWp1hUb.jpg

我尝试了 map 函数,但是我从 API 传入的数据流是一个数组数组,所以我尝试了 mergeMap 没有任何成功(https://www.learnrxjs.io/operators/transformation/mergemap.html

我尝试了一个do()语句来触发exportToFirebase(res.item) ,但看起来我在这里完全偏离了轨道:-P

预期结果:创建一个循环,将 Listing 类型的 item 参数发送到我的名为exportToFirebase(res.item)服务函数

问题?

  1. 如何为这些项目中的每一个添加附加属性? 例如res.items.inserted = new Date(); ?

  2. 如何将这些res.items到另一个名为exportToFirebase(res.item))函数?

mergeMap在您的情况下没用,因为它是为展平可观察对象而创建的。

所以map操作员应该做所有的工作。

getByTag(tag:string) {
  return this.http.get(this.URL + '/get/listings/', { headers })
    .pipe(
      map((res: Listings) => res.items),
      map((list: any[]) => {
        return list.map(sublist => sublist.map(item => {...item, inserted: new Date()}));
      })
    );
}

更新

您可以使用reduce来展平您的数组:

map((res: Listings) => res.items.reduce(((arr, list) => arr.concat(list), [])),

map((list: any[]) => {
  return list.map(item => {...item, inserted: new Date()});
})

要链接,您可以使用do / tap

tap((list: any[]) => {
  list.forEach(item => {
    exportToFirebase(item)
  });
})

所以exportToFirebase的实际执行是在你这边,如果它返回 Observable 或 smth,我知道该函数的签名是什么

如果我已经正确理解了您的问题,并且您想为结果数组中的每个项目添加一个字段,然后将每个项目单独传递给 exportToFirebase() 函数,那么这样的事情可能会有用:

getByTag(tag:string) {
  return this.http.get(this.URL + '/get/listings/', { headers })
    .pipe(
      map((res: Listings) => res.items)
    )
    .subscribe(items => {
      items.forEach(i => {
        i.inserted = new Date();

        exportToFirebase(i);
      });
    });
}

如果您不想使用订阅,您也可以使用tap运算符,如提到的另一个答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM