Возвращаете наблюдаемую изнутри подписку? - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь найти определенный документ в Angularfire, библиотеке Firebase для Angular. У меня есть наблюдаемая, которая возвращает правильный идентификатор документа, и я подписываюсь на эту наблюдаемую и использую идентификатор внутри для извлечения всех данных в документе, который также возвращается как наблюдаемая.

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

Моя текущая попытка это, во-первых, получить идентификатор документа, который я хочу. Это приходит в первую заметку, на которую я подписываюсь. Внутри этой подписки я использую идентификатор для получения вложенной коллекции 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 Ответ

2 голосов
/ 11 марта 2020

Я думаю, switchMap должно работать нормально, вы должны вернуть наблюдаемое в функцию.

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