alt*_*hen 2 rxjs angular2-observables angular rxjs-pipeable-operators
有没有比RxJS运算符更好的方法来循环从可观察对象返回的数组,而不是发出新的单独的ListingItem?
onGetItemData(){
this.dataService.getItemData().subscribe((itemData) =>
{
this.itemDataJSON = itemData;
this.itemDataJSON.forEach(function (value) {
let new_listing = new ListingItem(value.label,value.market,value.name);
console.log(new_listing);
});
});
}
Run Code Online (Sandbox Code Playgroud)
API返回包含项的单个数组,因此我无法使用.map访问itemData.name
//-- DataService --//
getItemData(){
return this.http.get(this._URL, { headers })
.pipe(map((res: Listings) => res.items))
}
Run Code Online (Sandbox Code Playgroud)
为什么不只是管道map()?
this.dataService.getItemData()
.pipe(
map(itemData => {
return itemData.map(value => {
return new ListingItem(value.label, value.market, value.name);
})
})
)
.subecribe((listingItem) => {
console.log(listingItem) // gives an array of listingItem
});
Run Code Online (Sandbox Code Playgroud)
请注意,.map()实际上是JavaScript的本机数组函数,您将通过遍历数组的每个项目使用它来转换数据。
仅用于一个班轮代码:
.pipe(
map(itemData => itemData.map(value => new ListingItem(value.label, value.market, value.name)))
)
Run Code Online (Sandbox Code Playgroud)
我自己仍在学习 Observables,但我认为你可以从数组创建一个 Observable,就像我在 StackBlitz 中所做的那样:https ://stackblitz.com/edit/angular-tbtvux
简而言之(在 Angular 6 中):
import { from, pipe } from 'rxjs';
...
let observable = from([10, 20, 30])
.subscribe(v => console.log(v));
Run Code Online (Sandbox Code Playgroud)
所以也许你可以在你的可观察对象上通过管道传递 switchMap 运算符,它返回一个数组,如下所示:
import { switchMap } from 'rxjs/operators';
...
yourArrayObservable$.pipe(
switchMap(val => from(val))
);
Run Code Online (Sandbox Code Playgroud)
...然后你可以像这样使用地图:
import { switchMap, map } from 'rxjs/operators';
...
yourArrayObservable$.pipe(
switchMap(val => from(val)),
map(val => val * 42)
);
Run Code Online (Sandbox Code Playgroud)
...至少这在我前面提到的 StackBlitz 中似乎有效。
更新:我认为 flatMap 运算符也可以类似地工作,只需一个运算符:
yourArrayObservable$.pipe(
flatMap(val => val * 42)
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5021 次 |
| 最近记录: |