我有几个可观察到的和REST端点,我订阅/调用并获取数据。
我希望从可观测点和REST端点获取所有数据,并创建一个变量将其发送到REST端点。
我正在使用forkJoin
和mergeMap
,如下所示:
const sources: Array<Observable<any>> = [
of(this.dataStore.trips$),
of(this.dataStore.passengers$),
of(this.dataStore.user$),
of(this.dataStore.user$.pipe(
mergeMap(user => <Observable<any>> this.userService.getUserIdByEmail(user.email))
)),
of(this.toursStore.totalInCart$),
of(this.toursStore.totalInCart$.pipe(
mergeMap(total => <Observable<any>> this.currencyService.getUSDConversionRate(total)),
))
];
forkJoin(sources).subscribe(
observables => {
const data = observables.map(observer => this.convertObservableToBehaviorSubject(observer, observer.source.value));
console.log(data);
booking = {
booking: {
created_at: Date.now(),
trips: data[0].value,
passengers: data[1].value,
total: data[4].value,
user_id: data[3].value,
total: data[5].value,
},
user: data[2].value
};
console.log(booking);
},
err => console.log('Error:', err)
);
将可观测值转换为BehaviorSubject的方法:
convertObservableToBehaviorSubject<T>(observable: Observable<T>, initValue: T): BehaviorSubject<T> {
const subject = new BehaviorSubject(initValue);
observable.subscribe(
(x: T) => {
subject.next(x);
},
(err: any) => {
subject.error(err);
},
() => {
subject.complete();
},
);
return subject;
}
当我console.log(data)
得到所有数据时,但是当我试图将值赋值给变量booking
时,我得到了user_id和的未定义
this.dataStore.user$.pipe(
mergeMap(user => <Observable<any>> this.userService.getUserIdByEmail(user.email))
)
和
this.toursStore.totalInCart$.pipe(
mergeMap(total => <Observable<any>> this.currencyService.getUSDConversionRate(total)),
)
我希望user_id
和total
有数据。
发布于 2019-08-16 07:26:43
退一步,你就可以让事情变得简单多了。
您不需要用of(...)
包围可观察到的对象,因为它们在一开始就已经是可观察的了。应该使用of
将对象输送到可观察的对象中。
只需与您已经拥有的可观测数据的对象(如字典)一起使用forkjoin即可。forkJoin({trips: this.datastore.trips$, passengers: this.datastore.passengers$, etc)
这意味着您将立即获得值,而不必将它们转换为BehavourSubject
。
所以最终的结果是
forkJoin({trips: this.datastore.trips$, passengers: this.datastore.passengers$, etc...})
.subscribe(data => {
booking = {
booking: {
created_at: Date.now(),
trips: data.trips,
passengers: data.passengers,
...etc
}
};
})
https://stackoverflow.com/questions/57526867
复制相似问题