我正在使用 forkJoin
将多个 observable 转换为一个,然后我将其映射以转换为我在组件中用于我的 View 的某个 View 模型。
我的模型如下:
export interface MyModel {
itemOne: Observable<ItemOne[]>;
itemTwo: Observable<ItemTwo[]>;
itemThree: Observable<ItemThree[]>;
}
我的 forkJoin
看起来像:
this._subscriptions.push(this.myService.getData()
.flatMap(data => Observable.forkJoin(data
.map(data => {
let myModel: MyModel = {
itemOne: this.myService.getSomeData(),
itemTwo: this.myService.getSomeData(),
itemThree: this.myService.getSomeData()
};
return Observable.forkJoin(Observable.from([myModel]));
}))).subscribe(details => {
details.map(this.toMyModelViewModel.bind(this));
}));
现在,在我的 toMyModelViewModel
方法中,我想从这些 Observables 中选取每个值,并且想知道我如何才能做到这一点?
toMyModelViewModel(value: MyModel): any {
return {
itemOne: value.itemOne,
itemTwo: value.itemTwo,
itemThree: value.itemThree
};
}
我是否必须订阅每个值才能获得当前值,或者是否有另一种可能更好/更清洁的方法?最终,我想要一个 MyModel 对象数组,这样我就不必担心使用 data |在我看来异步
。
谢谢
最佳答案
快速浏览一下您的代码,您似乎有一个初始 API 调用 (this.myService.getData()
),您将从中构建结果,但该结果基于结合多个 API 调用的结果 (this.myService.getSomeData()
)。
我觉得你需要 MyModel
接口(interface)才能没有 Observables:
export interface MyModel {
itemOne: ItemOne[];
itemTwo: ItemTwo[];
itemThree: ItemThree[];
}
... toMyViewModel
是一个工厂方法:
function toMyModelViewModel(itemOne: any, itemTwo: any, itemThree: any): MyModel {
return {
itemOne: itemOne as ItemOne[],
itemTwo: itemTwo as ItemTwo[],
itemThree: itemThree as ItemThree[]
} as MyModel;
}
... 那么您将使用 switchMap/forkJoin如下:
this.myService.getData().switchMap(data => {
return Observable.forkJoin(
this.myService.getSomeData(),
this.myService.getSomeData(),
this.myService.getSomeData(),
toMyModelViewModel
}).subscribe(...);
关于javascript - 将 Observable 数组转换为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48768480/