首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角映射与mergeMap rxjs6算子

角映射与mergeMap rxjs6算子
EN

Stack Overflow用户
提问于 2019-01-14 12:10:40
回答 2查看 594关注 0票数 1

新手问题:

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

我使用的是Angular6RxJS 6

代码语言:javascript
复制
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

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

问题?

  1. 如何向这些项中的每个项添加附加属性?例如res.items.inserted = new Date();
  2. 如何将每个res.items链接到另一个名为exportToFirebase(res.item))的函数?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-15 16:36:28

在您的情况下,mergeMap是无用的,因为它是为扁平的可观测值创建的。

因此,map操作符应该完成所有的工作。

代码语言:javascript
复制
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将数组扁平化。

代码语言:javascript
复制
map((res: Listings) => res.items.reduce(((arr, list) => arr.concat(list), [])),

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

要链接,可以使用do/tap

代码语言:javascript
复制
tap((list: any[]) => {
  list.forEach(item => {
    exportToFirebase(item)
  });
})

所以exportToFirebase的实际执行就在您这一边,如果它返回可观察的或smth,那么这个函数的签名是什么?

票数 1
EN

Stack Overflow用户

发布于 2019-01-15 16:43:55

如果我已经正确地理解了您的问题,并且您希望在结果数组中的每个项中添加一个字段,然后将每个字段分别传递给exportToFirebase()函数,那么这样的内容可能是有用的:

代码语言:javascript
复制
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);
      });
    });
}

您也可以使用攻丝操作符,这是另一个提到的答案,如果您不想使用订阅。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54181320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档