Я пытаюсь вытащить массив doc.data из функции и использовать его за пределами области видимости. - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь извлечь массив docData из функции и по какой-то причине я не могу извлечь переменную из функции и использовать ее вне области действия. Я хочу иметь возможность извлекать массив и использовать его свободный от объема

          function showData() {
            var jobRef = dataFirebase.collection("Jobs").where("Industry" , "==" , "Medical");


            jobRef.get().then(function(querySnapshot) {

              let allDocData = [];
              querySnapshot.forEach(function(doc) {
                  allDocData.push(doc.data());
              });

              return allDocData;

            });
          }

          var dataValues = showData()


          console.log(dataValues);

Я надеюсь вывести значения allDocData и свободно использовать их вне области действия функции.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Данные загружаются из Firestore асинхронно, чтобы предотвратить блокировку браузера.Пока данные загружаются, остальная часть вашего кода продолжается.Затем, когда данные загружаются, вызывается блок / обратный вызов then().

Проще всего понять, что это значит, поместив некоторые записи журнала в ваш код:

var jobQuery = dataFirebase.collection("Jobs").where("Industry" , "==" , "Medical");

console.log("Before starting to load");
jobQuery.get().then(function(querySnapshot) {
    console.log("Got data");
});
console.log("After starting to load");

Когда вызапустить этот код, вывод:

Перед началом загрузки

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

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

Этовероятно, не тот порядок, который вы ожидали, и имеет смысл, если вы прочитаете мое объяснение выше.Но это также означает, что ваше заявление return ничего не делает.На самом деле функция уже давно завершена к моменту загрузки данных.

По этой причине любой код, которому нужны данные, должен либо находиться внутри обратного вызова then(), либо вызываться из него.


Итак, самый простой пример этого - переместить запись данных в обратный вызов:

  function showData() {
    var jobQuery = dataFirebase.collection("Jobs").where("Industry" , "==" , "Medical");

    jobQuery.get().then(function(querySnapshot) {

      let allDocData = [];
      querySnapshot.forEach(function(doc) {
          allDocData.push(doc.data());
      });

      console.log(dataValues);

    });
  }

  showData()

Это работает, но ограничивает возможность повторного использования вашего showData() метода.


Более современный и многократно используемый вариант - использовать тот факт, что get() возвращает обещание, и возвращать это обещание вызывающему коду.Вы даже можете возвращать значения из обещания, которое затем «всплывает» для вызывающей стороны:

function showData() {
  var jobRef = dataFirebase.collection("Jobs").where("Industry" , "==" , "Medical");


  return jobRef.get().then(function(querySnapshot) {

    let allDocData = [];
    querySnapshot.forEach(function(doc) {
        allDocData.push(doc.data());
    });

    return allDocData;

  });
}

showData().then(function(dataValues) {
    console.log(dataValues);
});

Вы заметите, что теперь у нас также есть блок then() в вызывающем коде, потому что нам нужноподождать с записью значения, пока данные не будут асинхронно загружены.

0 голосов
/ 25 января 2019

Если вы просто хотите использовать allDocData вне функции:

var docData;

function showData() {
    var jobRef = dataFirebase.collection("Jobs").where("Industry" , "==" , "Medical");


    jobRef.get().then(function(querySnapshot) {

    let allDocData = [];
    querySnapshot.forEach(function(doc) {
        allDocData.push(doc.data());
    });
    docData = allDocData;
    //Rest of code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...