Javascript 检索Firebase数据并将其返回的最佳方法,或另一种方法

Javascript 检索Firebase数据并将其返回的最佳方法,或另一种方法,javascript,asynchronous,firebase,firebase-realtime-database,Javascript,Asynchronous,Firebase,Firebase Realtime Database,我在一些项目中使用Firebase,我非常喜欢这个平台 我只是偶然发现了一件我做不到的事情,我想知道是否有任何方法可以实现它,或者是否有其他方法可以实现它 我试图做的是创建一个函数,从Firebase数据库中检索最后X个条目,并将数据返回给调用函数 大概是这样的: function getTwoLatestLocations() { var twoLocations; myFirebaseRef.limitToLast(2).once('value', function (dat

我在一些项目中使用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
}
function someCalcutationsWithTheTwoLastLocations()
{
    getTwoLatestLocations(function(twoLocations) {
        // Do some calculations
    });
}
然后这样称呼它:

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
}
function someCalcutationsWithTheTwoLastLocations()
{
    getTwoLatestLocations(function(twoLocations) {
        // Do some calculations
    });
}
但是,正如您可能猜到的,对数据库引用的调用是异步的,因此返回的对象总是未定义的

有没有一种方法可以优雅地做到这一点,这样我就可以将这些方法分开


另外,目前我所有的代码都在对数据库的调用中。难看。

要分离代码,您需要传入回调:

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 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
}
function someCalcutationsWithTheTwoLastLocations()
{
    getTwoLatestLocations(function(twoLocations) {
        // Do some calculations
    });
}
要始终记住的重要一点是,您不能等待异步加载的内容


这已经被讨论了好几次,包括在相关问题列表中的第一个答案中:

是。这是两种选择之一。我选择了另一种选择。每次调用on方法时缓存快照。我想这只是偏好的问题。我会将此标记为正确答案,因为您提到了一种可能性,并提供了包含另一种可能性的链接。如果现在没有人回答的话,我自己也会回答的。谢谢。如果我的答案有用的话,请投它一票。如果我的回答为你提供了解决方案,那就接受它。我知道你选择了另一个解决方案,自我回答并接受它。这在StackOverflow上是完全可以接受的。