从订阅内部返回可观察的东西?

问题描述 投票:0回答:1

我正在尝试在Angular的Firebase库Angularfire中找到某个文档。我有一个可观察的对象,它返回了正确的文档ID,我正在订阅该可观察的对象,并使用内部的ID来获取文档上的所有数据,这也作为可观察的对象返回。

  getSessions(date: firestore.Timestamp) {
    this.db.collection('days', ref => ref.where('date', '==', date)).snapshotChanges().subscribe(docRef => {
      return this.db.collection('days').doc(docRef[0].payload.doc.id).collection('sessions').valueChanges();
    })
  }

首先,我目前的尝试是获取我想要的文档的ID。这是我订阅的第一个观察者。在此订阅中,我使用ID来获取嵌套的sessions集合。 this.db.collection('days').doc(docRef[0].payload.doc.id).collection('sessions').valueChanges();完全可以满足我的需求,但是如果我尝试返回此值,则接收方法将仅获得undefined值。这让我感到不同步。

[我看过一些建议使用switchMap的帖子,但我也没有尝试这样做。

  getSessions(date: firestore.Timestamp) {
    this.db.collection('days', ref => ref.where('date', '==', date)).snapshotChanges().pipe(switchMap(docRef => {
      return this.db.collection('days').doc(docRef[0].payload.doc.id).collection('sessions').valueChanges();
    }))
  }

作为参考,collection方法始终返回一个可观察值。如果我自己在所有订阅之外运行最内层的行,它将返回一个可观察到的内容,并且可以很好地完成我所需的行为。

angular typescript observable angularfire
1个回答
2
投票

我认为switchMap应该可以正常工作,但是您必须在函数中返回observable。

getSessions(date: firestore.Timestamp) {
    // !! check out the first return here !!
    return this.db.collection('days', ref => ref.where('date', '==', date)).snapshotChanges().pipe(switchMap(docRef => {
      return this.db.collection('days').doc(docRef[0].payload.doc.id).collection('sessions').valueChanges();
    }))
  }

...
this.getSessions(...).subscribe(data => { console.log(data) });
© www.soinside.com 2019 - 2024. All rights reserved.