[英]RxJS Observable returning array, run another function with each array iteration
[英]Rxjs: map each element in an array field from an observable of object with another observable
我有一个名为 getTransactionDetails(id:string) 的方法,它返回一个 Observable of TransactionDetails object
getTransactionDetails(id:string):Observable<TransactionDetails>
TransactionDetails object 如下所示:
class TranscationDetails{
id:string;
accessCode: string;
veggiesList: Array<Veggie>;
meatList: Array<Meat>;
}
Veggie object 看起来像这样:
class Veggie{
id: string;
name: string;
}
我有另一个方法叫做 getVeggieSummary(veggieId: string),它返回一个 VeggieSummary 的 Observable:
getVeggieSummary(veggiesId:string):Observable<VeggieSummary>
VeggieSummary 看起来像这样
class VeggieSummary{
id:string;
name:string;
color:string;
kind:string;
}
我想调用 getTransactionDetails(1),并将 veggiesList 中的所有 Veggies 元素转换为 VeggieSummary 并返回一个 VeggieSummary 数组。
这就是我所拥有的
getTransactionDetails(1)
.flatMap(transactionDetails=>
transactionDetails.veggiesList
.map(veggie=>getVeggieSummary(veggie.id)))
.subscribe(result=>
console.log(result)
)
目前, result
是一个Observable<VeggieSummary>
并且内部 observable 甚至没有被订阅......
我怎样才能拥有一个带有 rxjs 运算符的Observable<VeggieSummary[]>
?
注意:我的app的angular版本不支持pipe,RxJS版本是v5
您能否尝试使用forkjoin
包装数组以查看它是否解决了问题? 我认为目前它正在返回Observable<VeggieSummary>[]
getTransactionDetails(1)
.flatMap(transactionDetails=>
forkJoin(transactionDetails.veggiesList
.map(veggie=>getVeggieSummary(veggie.id))))
.subscribe(result=>
console.log(result)
)
您只需要用forkJoin
包装内部可观察对象,这会将Observable<VeggieSummary>[]
转换为Observable<VeggieSummary[]>
getTransactionDetails(1)
.flatMap((transactionDetails) =>
forkJoin(
transactionDetails.veggiesList.map((veggie) =>
getVeggieSummary(veggie.id)
)
)
)
.subscribe((result) => console.log(result));
使用forkjoin,这有效:
getTransactionDetails(1)
.flatMap((transactionDetails) =>
forkJoin(
transactionDetails.veggiesList.map((veggie) =>
getVeggieSummary(veggie.id)
)
)
)
.subscribe((result) => console.log(result));
我发现 zip 与传播运算符 (...) 也有效:
getTransactionDetails(1)
.flatMap((transactionDetails) =>
zip(
...transactionDetails.veggiesList.map((veggie) =>
getVeggieSummary(veggie.id)
)
)
)
.subscribe((result) => console.log(result));
我从另一篇文章中了解到的。
但我不确定使用哪个,forkjoin 还是 zip? 有关系吗?
我还从该帖子中了解了 rest 运算符/展开运算符 (...)。
但是我仍然不太了解它在这个例子中是如何工作的。
我不确定我使用的是哪个,我使用的是 rest 还是传播运算符?
它等价于什么?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.