Node.js Запрос коллекции Firestore forEach не может заполнить ассоциативный массив - PullRequest
0 голосов
/ 05 апреля 2020

В этом упрощенном примере ассоциативный массив A не может быть заполнен в запросе Node.js Firestore - как будто существует проблема с областью видимости:

var A = {};

A["name"] = "nissa";

firestore.collection("magic: the gathering")
  .get()
  .then(function(query) {
    query.forEach(function(document) {
        A[document.id] = document.id;
        console.log(A);
    });
  })
  .catch(function(error) {
});

console.log(A);

Вывод на консоль:

{ name: 'nissa' } < last console.log()
{ name: 'nissa', formats: 'formats' } < first console.log() (in forEach loop)
{ name: 'nissa', formats: 'formats', releases: 'releases' } < second console.log() (in forEach loop)

Благодарен за любую помощь, пожалуйста, запросите дополнительную информацию, если это необходимо.

1 Ответ

0 голосов
/ 05 апреля 2020

Данные загружаются из Firestore асинхронно, и пока это происходит, ваш основной код продолжает выполняться.

Проще всего понять, что это значит, поместив несколько операторов регистрации:

console.log("Starting to load data");
firestore.collection("magic: the gathering")
  .get()
  .then(function(query) {
    console.log("Got data");
  });
console.log("After starting to load data");

Когда вы запускаете этот код, он печатает:

Начало загрузки данных

После начала загрузки данных

Получил данные

Вероятно, это не тот порядок, в котором вы ожидали ведения журнала. Но на самом деле он работает так, как задумано, и объясняет вывод, который вы видите. К моменту последнего запуска console.log(A); данные еще не были загружены, поэтому A пусто.


Решение простое, но обычно требуется некоторое время, чтобы привыкнуть к: весь код, которому нужны данные из базы данных, должен быть внутри обратного вызова или вызываться оттуда.

Так что-то вроде этого:

var A = {};

A["name"] = "nissa";

firestore.collection("magic: the gathering")
  .get()
  .then(function(query) {
    query.forEach(function(document) {
        A[document.id] = document.id;
    });
    console.log(A);
  })

Также см .:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...