Это связано с тем, что функция Firebase является асинхронной - код внутри метода, который получает снимок, представляет собой callback , который выполняется после завершения чтения Firebase, что может занять несколько секунд. Тем не менее, как только вы отправите запрос на чтение через .once(...)
, ваш поток выполнения продолжится и будет вызван возврат.
Есть несколько возможных решений:
Передайте аргумент обратного вызова вашему createSession()
методу, который вызывается со значениями, которые вы пытаетесь вернуть, вместо того, чтобы возвращать их напрямую.
Возвращает обещание вашего метода, которое разрешает дать значения, которые вы пытаетесь вернуть.
Используйте синтаксис async
/ await
для вызова Firebase. Это уже рассматривается в этом вопросе: выполнение запросов в firebase с использованием async / await
Грубый пример # 1
function createSession(onSessionCreated) {
var user_session = "whatever";
var initiate_session = new Object();
firebase.database().ref(user_session).once('value', function (snapshot) {
// do things with the snapshot
onSessionCreated(initiate_session, initiate_session[user_session].events, user_session)
});
}
// usage:
createSession(function (initiate_session, events, user_session) {
// do things with initiate_session, events and user_session
});
Грубый пример # 2
function createSession() {
var user_session = "whatever";
var initiate_session = new Object();
firebase.database().ref(user_session).once('value').then(function (snapshot) {
// do things with the snapshot
return [initiate_session, initiate_session[user_session].events, user_session];
});
}
// usage:
createSession().then(function (results) {
// do things with results (i.e. the three elements in the array above)
});
Грубый пример 3
async function createSession() {
var user_session = "whatever";
var initiate_session = new Object();
const snapshot = await firebase.database().ref(user_session).once('value');
// do things with the snapshot
return [initiate_session, initiate_session[user_session].events, user_session];
}
// usage:
const results = await createSession();
Если вы новичок в async
/ await
коде, вероятно, это будет не самое легкое место для начала, так как для этого могут потребоваться изменения в другом месте вашего кода, но эта статья хорошая ресурс, если вы хотите учиться.