Данные загружаются из 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()
в вызывающем коде, потому что нам нужноподождать с записью значения, пока данные не будут асинхронно загружены.