Создать наблюдаемый из массива - PullRequest
0 голосов
/ 01 мая 2019

Я хочу подписаться на список событий на основе их идентификаторов.Я использую AngularFire2 и Firebase .Не уверен, правильно ли создавать заметку при подписке на другую.

eventsRef: AngularFireList<any>
events: Observable<any[]>
o2: Observable<any[]>


//get all event ids for a particular user
this.eventsRef = db.list(`eventsGuestsLookup/${this.id}`)
this.events = this.eventsRef.snapshotChanges().pipe(
    map(changes =>
        changes.map(c => (c.payload.key))
    )
 )

 this.events.subscribe(data => {
      console.log(data) //array with all event keys
      const o1 = Observable.from(data)
      this.o2 = o1.flatMap(x => {
          return this.getEvent(x);
      })
 })

 getEvent(eventid: string) {
     return this.db.object(`/events/${eventid}`).valueChanges()
 }

1 Ответ

0 голосов
/ 01 мая 2019

Я думаю, это то, что вы хотели бы сделать:

//get all event ids for a particular user
this.eventsRef = db.list(`eventsGuestsLookup/${this.id}`)
this.events = this.eventsRef.snapshotChanges().pipe(
  map(changes =>
    changes.map(c => (c.payload.key))
  )
)

this.events
.pipe(
  switchMap(eventKeys => {
    eventObservables = eventKeys.map(eventKey => this.getEvent(eventKey));
    return combineLatest(eventObservables);
  })
)
.subscribe(data => {
  // Do whatever you want to do
});

getEvent(eventid: string) {
  return this.db.object(`/events/${eventid}`).valueChanges();
}
  1. Использование switchMap для перехода к другой наблюдаемой
  2. Использование eventKeys.map для просмотра всех ключей событий и запроса изменений значений для каждого из них.
  3. Используйте функциюlateLatest (), чтобы сгруппировать все наблюдаемые события в одну наблюдаемую.

Упрощенная версия всего этого может быть:

//get all event ids for a particular user
db.list(`eventsGuestsLookup/${this.id}`).snapshotChanges()
.pipe(
  switchMap(changes => {
    eventObservables = changes.map(c => this.db.object(`/events/${c.payload.key}`).valueChanges());
    return combineLatest(eventObservables);
  })
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...