检索Firebase数据并将其返回的最佳方式,或替代方法

Sig*_*dur 2 javascript asynchronous firebase firebase-realtime-database

我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)

然后像这样调用它:

function someCalcutationsWithTheTwoLastLocations()
{
    var twoLastLocations = getTwoLatestLocations();
    // Do some calculations
}
Run Code Online (Sandbox Code Playgroud)

但正如您可能已经猜到的那样,对数据库引用的调用是异步的,因此返回的对象将始终未定义.

有没有办法优雅地做到这一点,所以我可以保持方法分离?

PS目前我的所有代码都只是在数据库调用中.丑陋.

Fra*_*len 7

要将代码分开,您需要传递一个回调:

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);
    });

}
Run Code Online (Sandbox Code Playgroud)

然后像这样调用它:

function someCalcutationsWithTheTwoLastLocations()
{
    getTwoLatestLocations(function(twoLocations) {
        // Do some calculations
    });
}
Run Code Online (Sandbox Code Playgroud)

永远记住的重要一点是你不能等待异步加载的东西.

这已经被覆盖了很多次,包括相关问题列表中的最佳答案:在函数中处理异步调用(Firebase)