Angular l oop поверх данных Firestore - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть приложение Angular, использующее Firebase для хостинга и Firestore для хранения моих данных. Я хотел бы создать функцию, которая считывает все данные для определенной коллекции c и l oop поверх документов для выполнения определенного действия (загрузка в Google Drive, который уже был закодирован).

Тем не менее, я изо всех сил пытаюсь найти документы в моей коллекции Firestore. Это мой код для чтения данных из моей «тестовой» коллекции в Firestore:

read() {
    let result = [];

    this.firestore
      .collection("test")
      .snapshotChanges()
      .subscribe(item => {
        item.map(row => {
          result.push(row.payload.doc.data());
        })
      })

    return result;
  }

В другом компоненте, когда я вызываю эту функцию read () и ее console.log, я вижу все данные в коллекция. Однако, когда я пытаюсь пролистать документы и по отдельности console.log, ничего не выводится.

async doSomething() {
    let allRows = await this.firebase.read();  // the function shown above
    console.log(allRows);  // I can see all the "rows"/documents in the collection

    allRows.forEach(item => console.log(item)); // but if I do this, it doesn't output anything
    console.log(allRows.length);  // even this outputs 0
}

Я что-то упускаю из виду?

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

После некоторых копаний я обнаружил проблему с моим кодом. Проблема в присвоении результата операции чтения переменной allRows.

Вместо этого:

let allRows = await this.firebase.read();

Это сработало для меня:

let allRows: any;
await this.firebase.read().then(result => allRows = result);
0 голосов
/ 12 апреля 2020

Ваш метод чтения не будет ждать данных из firestore, поскольку это асинхронное действие и возвращает пустой массив. Вы должны изменить метод чтения следующим образом

read() {
    return new Promise((resolve, reject) => {
      let result = [];
      this.firestore
        .collection("test")
        .snapshotChanges()
        .subscribe(item => {
          Array.from(item).forEach(row => {
            result.push(row.payload.doc.data());
          });
          resolve(result);
        });
    });
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...