2016-01-20 31 views
1

我正在爲某些項目使用Firebase,並且很喜歡這個平臺。檢索Firebase數據並將其返回或以其他方式返回的最佳方式

我只是偶然發現了一件我無法做到的事情,並想知道是否有辦法實現它,或者如果有另一種方法做到這一點。

我想要做的是創建一個函數來從我的Firebase數據庫中檢索最後X個條目並將數據返回給調用函數。

事情是這樣的:

function getTwoLatestLocations() 
{ 
    var twoLocations; 
    myFirebaseRef.limitToLast(2).once('value', function (dataSnapshot) { 
     twoLocations = dataSnapshot.val(); 
    }, function (errorObject) { 
     // code to handle read error 
     console.log("The read failed: " + errorObject.code); 
    }); 

    return twoLocations; 
} 

,然後調用它像這樣:

function someCalcutationsWithTheTwoLastLocations() 
{ 
    var twoLastLocations = getTwoLatestLocations(); 
    // Do some calculations 
} 

但是,正如你可能已經猜到了調用數據庫引用是異步所以返回的對象總是會未定義。

有沒有辦法做到這一點優雅,所以我可以保持方法分開?

P.S.目前我所有的代碼都只是在調用數據庫的時候。醜陋。

回答

4

對代碼進行分離,你會傳遞一個回調:

function getTwoLatestLocations(callback) 
{ 
    var twoLocations; 
    myFirebaseRef.limitToLast(2).once('value', function (dataSnapshot) { 
     twoLocations = dataSnapshot.val(); 
     callback(twoLocations); 
    }, function (errorObject) { 
     // code to handle read error 
     console.log("The read failed: " + errorObject.code); 
    }); 

} 

,然後調用它像這樣:

function someCalcutationsWithTheTwoLastLocations() 
{ 
    getTwoLatestLocations(function(twoLocations) { 
     // Do some calculations 
    }); 
} 

重要的是要始終記住的是,你不能等待對於異步加載的東西。

這已經覆蓋了好幾次,其中包括來自相關問題列表此之上答案:Handling Asynchronous Calls (Firebase) in functions

+0

是。這是兩種選擇之一。 我選擇了其他選項。每次調用on方法時要緩存我的快照。 我想這只是一個偏好問題。自從您提到一種可能性並提供包含另一種可能性的鏈接以後,我會將其標記爲正確答案。 如果現在沒有人會回答,我自己會回答。謝謝。 – Sigmundur

+0

如果我的答案是有用的,upvote它。如果我的回答爲您提供瞭解決方案,請接受它。我選擇了另一種解決方案,自我回答並接受這個解決方案。這在StackOverflow上完全可以接受。 –

相關問題