Метод обхода узла базы данных в реальном времени с использованием Angularfire2 и возврата объекта - PullRequest
0 голосов
/ 04 ноября 2018

Я новичок в Angular и RxJS и действительно борюсь со следующей проблемой.

У меня есть следующая структура базы данных Firebase в реальном времени:

-States
     - AZ
         -Flagstaff
                  -ar
                     -0
                       -name: "Default"
                       -amount: 100
                        ...
                     -1
                       -name: "Alt 1"
                       -amount: 200
                       ...
          -Phoenix
                  -ar
                     -0
                       -name: "Default"
                       -amount: 150
                     -1
                       -name: "Alt 1"
                       -amount: 200
     - CA
         -Anaheim_Hills
...

Я пытаюсь создать службу Angular, которая будет тянуть ссылку для узла состояний (например, AZ), перебирать дерево объектов, выбирать определенные элементы, выполнять некоторые манипуляции и возвращать простой массив следующих объектов:

  interface Jurisdiction {
  path: string; //eg '/States/AZ/Flagstaff'
  name: string;
  categories: [{
    path: string; //eg '/States/AZ/Flagstaff/ar/0'
    name: string; // eg 'Default'
  }];
}

Я соединил следующий метод на основе того, что нашел в Интернете, но, похоже, take(1) больше не является методом Observable. Я также не уверен, как обеспечить выполнение асинхронной функции обхода до того, как метод возвратит массив Jurisdiction [].

getJurisdictions(state: string): Jurisdiction[] {
let ret: Jurisdiction[];
const statePath = '/States/' + state;
this.stateRef = this.db.list(statePath);

const s = this.stateRef.snapshotChanges().take(1).toPromise().then(snaps => {
  snaps.forEach(snap => {
    let jur: Jurisdiction;
    jur.path = statePath + '/' + snap.key;
    jur.name = snap.key.replace('_', ' ');
    snap.payload.forEach(snap2 => {
      let cat: {
        path: string;
        name: string;
      };
      cat.path = jur.path + '/' + 'SUB PATH PLACEHOLDER eg Flagstaff/ar/0';
      cat.name = 'NAME PLACEHOLDER';
      jur.categories.push(cat);
      return true;
    });
    ret.push(jur);
  });
});

return ret;
}
...