Как правильно запустить функцию firebase? - PullRequest
0 голосов
/ 06 января 2019

Эта функция вернет значение initiate_session, initiate_session[user_session].events, user_session перед запуском функции firebase.

Как сначала запустить функцию firebase ??

function createSession() {
var user_session = randomCharacters(20) //8iKhA4Aq2!6gZ)890ip@;
var ip = '127.0.0.1';
var initiate_session = new Object();
var session_started = new Date().getTime();


firebase.database().ref(user_session).once('value', function (snapshot) {
    if (snapshot.exists()) {
        console.log('session exists');
        createSession();
    } else {
        console.log('session not exists')

        initiate_session[user_session] = {
            ip: ip,
            session_started: session_started,
            events: {}
        };

        firebase.database().ref(user_session).set({
            ip: ip,
            session_started: session_started,
            events: {}
        });
    }
});

console.log('new session', initiate_session);
return [initiate_session, initiate_session[user_session].events, user_session];}

1 Ответ

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

Это связано с тем, что функция Firebase является асинхронной - код внутри метода, который получает снимок, представляет собой callback , который выполняется после завершения чтения Firebase, что может занять несколько секунд. Тем не менее, как только вы отправите запрос на чтение через .once(...), ваш поток выполнения продолжится и будет вызван возврат.

Есть несколько возможных решений:

  1. Передайте аргумент обратного вызова вашему createSession() методу, который вызывается со значениями, которые вы пытаетесь вернуть, вместо того, чтобы возвращать их напрямую.

  2. Возвращает обещание вашего метода, которое разрешает дать значения, которые вы пытаетесь вернуть.

  3. Используйте синтаксис 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 коде, вероятно, это будет не самое легкое место для начала, так как для этого могут потребоваться изменения в другом месте вашего кода, но эта статья хорошая ресурс, если вы хотите учиться.

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