首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Angular中组合可观测数据的正确方法是什么?

在Angular中组合可观测数据的正确方法是什么?
EN

Stack Overflow用户
提问于 2020-08-30 08:56:14
回答 1查看 59关注 0票数 0

我对RxJS和异步数据没有太多的经验。我一直在嵌套订阅,感觉不太对劲。我想知道组合或使用多个数据点的正确方法是什么,比如获取用户个人资料和他们的帖子。这是我目前所拥有的:

代码语言:javascript
运行
复制
  constructor(private storage: AngularFireStorage, private db: AngularFirestore, private route: ActivatedRoute) {
    // Get profile
    this.route.paramMap.subscribe(params => {
      const profileName = params.get('id');
      const username = db.doc<any>('usernames/' + profileName).valueChanges();
      username.subscribe(val => {
        this.user = db.doc<User>('users/' + val.user).valueChanges();
        this.user.subscribe(val => {
          const userPosts = this.db.collection<Post>('posts', ref => ref.where('user', '==', val.uid)).snapshotChanges();
          this.posts = userPosts.pipe(map(actions => actions.map(a => {
            const data = a.payload.doc.data() as Post;
            const mediaUrl = this.storage.ref('post/m/' + data.mediaM).getDownloadURL();
            const userData: Observable<User> = db.doc<User>('users/' + data.user).valueChanges();

            return {mediaUrl, userData, ...data}
          })))
        });
      });
    });
  }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-30 09:24:32

您可以使用switchMap将结果从一个可观察对象传递到另一个可观察对象,这样就不需要嵌套订阅。

代码语言:javascript
运行
复制
this.route.paramMap.pipe(
  map(params => params.get('id')),
  switchMap(profileName => db.doc<any>('usernames/' + profileName).valueChanges()),
  switchMap(val => db.doc<User>('users/' + val.user).valueChanges()),
  switchMap(val => this.db.collection<Post>('posts', ref => ref.where('user', '==', val.uid)).snapshotChanges())
).subscribe(val => {});
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63653058

复制
相关文章

相似问题

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