![](/img/trans.png)
[英]Angular 6 & rxjs6 - piped operators - Type 'Observable<>' provides no match for the signature
[英]Angular Map and mergeMap rxjs6 operators
新手问题:
我正在尝试将我的数据从 rest API 导出到 firebase。
我将Angular6与RxJS 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)
服务函数
问题?
如何为这些项目中的每一个添加附加属性? 例如res.items.inserted = new Date();
?
如何将这些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.