从订阅内部返回一个可观察对象?

Returning an observable from inside a subscription?

我正在尝试在 Angularfire(Angular 的 Firebase 库)中查找某个文档。我有一个 Observable,它 return 是正确的文档 ID,我正在订阅这个 Observable 并使用里面的 ID 来获取文档上的所有数据,它也作为一个 Observable 返回。

  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(); 得到我需要的东西,但如果我尝试 return 这个,接收方法将只会得到一个 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 方法总是 return 是一个可观察的。如果我 运行 最里面的行本身,在任何订阅之外,它将 return 一个可观察的并完成我需要的行为就好了。

我认为 switchMap 应该可以正常工作,但是您必须 return 函数中的可观察对象。

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) });