簡體   English   中英

如何正確運行 firebase 功能?

[英]How to run a firebase function correctly?

此函數將在initiate_session, initiate_session[user_session].events, user_session函數運行之前返回initiate_session, initiate_session[user_session].events, user_session的值。

如何先運行 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];}

這是因為 Firebase 函數是異步的 - 獲取快照的方法內部的代碼是在 Firebase 讀取完成后執行的回調,這可能需要幾秒鍾。 但是,一旦您通過.once(...)分派讀取請求,您的執行流程就會繼續並調用返回。

有幾種可能的解決方案:

  1. 將回調參數傳遞給使用您嘗試返回的值調用的createSession()方法,而不是直接返回它們。

  2. 從您的方法返回一個承諾,該承諾解析為您嘗試返回的值。

  3. 對 Firebase 調用使用async / await語法。 這個問題已經涵蓋了這一點: 使用 async / await 在 firebase 中運行查詢

#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代碼,它可能不是最容易開始的地方,因為它可能需要在代碼的其他地方進行更改,但如果您渴望學習,這篇文章是一個很好的資源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM