首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用mergeMap订阅可观测数据数组

使用mergeMap订阅可观测数据数组
EN

Stack Overflow用户
提问于 2019-08-16 14:58:44
回答 1查看 491关注 0票数 0

我有几个可观察到的和REST端点,我订阅/调用并获取数据。

我希望从可观测点和REST端点获取所有数据,并创建一个变量将其发送到REST端点。

我正在使用forkJoinmergeMap,如下所示:

代码语言:javascript
运行
复制
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的方法:

代码语言:javascript
运行
复制
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和的未定义

代码语言:javascript
运行
复制
this.dataStore.user$.pipe(
   mergeMap(user => <Observable<any>> this.userService.getUserIdByEmail(user.email))
)

代码语言:javascript
运行
复制
this.toursStore.totalInCart$.pipe(
        mergeMap(total => <Observable<any>> this.currencyService.getUSDConversionRate(total)),
      )

我希望user_idtotal有数据。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-16 15:26:43

退一步,你就可以让事情变得简单多了。

您不需要用of(...)包围可观察到的对象,因为它们在一开始就已经是可观察的了。应该使用of将对象输送到可观察的对象中。

只需与您已经拥有的可观测数据的对象(如字典)一起使用forkjoin即可。forkJoin({trips: this.datastore.trips$, passengers: this.datastore.passengers$, etc)

这意味着您将立即获得值,而不必将它们转换为BehavourSubject

所以最终的结果是

代码语言:javascript
运行
复制
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
          }
        };
  })
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57526867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档