【问题标题】:Returning an observable from inside a subscription?从订阅中返回一个可观察的?
【发布时间】:2020-06-23 20:28:56
【问题描述】:

我正在尝试在 Angularfire(Angular 的 Firebase 库)中查找某个文档。我有一个 observable,它返回正确的文档 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。这是我订阅的第一个 observable。在此订阅中,我使用 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 方法总是返回一个 observable。如果我在任何订阅之外单独运行最里面的行,它将返回一个可观察的并完成我所需的行为。

【问题讨论】:

    标签: angular typescript observable angularfire


    【解决方案1】:

    我认为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) });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-12
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 2018-03-27
      • 1970-01-01
      • 2018-04-29
      • 2016-06-26
      相关资源
      最近更新 更多