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

时间:2020-03-11 19:17:17

标签: angular typescript observable angularfire

我正在尝试在Angularfire的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方法始终返回一个可观察值。如果我自己在所有订阅之外运行最里面的行,它将返回一个可观察到的内容,并且可以很好地完成我所需的行为。

1 个答案:

答案 0 :(得分: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) });